- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对 XSD 设计和 JAXB 都是新手。我成功创建了 XSD,如下所示:
<xsd:element name="policy" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="actor-def" type="tns:actor-def"/>
<xsd:element name="actor-system-def" type="tns:actor-system-def"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="actor-def">
<xsd:sequence>
<xsd:element name="actor-system" type="tns:actor-system-type"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:ID" use="required" />
</xsd:complexType>
<xsd:complexType name="actor-system-type">
<xsd:attribute name="name" type="xsd:IDREF" use="required" />
</xsd:complexType>
<xsd:complexType name="actor-system-def">
<xsd:attribute name="name" type="xsd:ID" use="required" />
<xsd:attribute name="url" type="xsd:anyURI" use="required" />
</xsd:complexType>
基本上,我有一个“policy”的根元素,它允许定义多个“actor-def”和“actor-system-def”。每个“actor-def”将属于一个通过使用ID和IDREF实现的“actor-system-def”。
为了使用 JAXB,我使用 Eclipse 的 JAXB Classes for Schema 创建工具自动创建了所有必需的类。它根据 XSD 文件自动创建以下类:
策略.java
ActorDef.java
ActorSystemDef.java
ActorSystemType.java
除了 ActorDef.java 文件以及其中使用 XSD 文件中的 IDREF 定义的 actorSystem 变量的类型之外,一切看起来都很好。基本上,ActorDef.java 文件具有以下内容:
@XmlElement(name = "actor-system", required = true)
protected ActorSystemType actorSystem;
public ActorSystemType getActorSystem() {
return actorSystem;
}
问题在于,由于 ActorDef.getActorSystem() 返回的类型是 ActorSystemType 类型,因此它是对错误对象的引用。我想要的是对相关 ActorSystemDef 的引用,以便我可以调用 getName() 方法来获取 ActorSystemDef 的名称(如下所示)
JAXBContext myJAXBContext = JAXBContext.newInstance("spec_jaxb");
Unmarshaller myUnmarshaller = myJAXBContext.createUnmarshaller();
Policy myPolicy = (Policy) myUnmarshaller.unmarshal(new File("src/main/java/spec/private_policy.xml"));
List<ActorDef> actorList = myPolicy.getActorDef();
for (ActorDef actor : actorList) {
System.out.println(actor.getActorSystem().getName());
}
我能够通过手动修改 JAXB 工具自动创建的类来使代码正常工作。我将 ActorDef.java 中的 actorSystem 变量的类型更改为 ActorSystemDef,如下所示:
protected ActorSystemDef actorSystem;
public ActorSystemDef getActorSystem() {
return actorSystem;
}
这解决了问题并且代码工作正常,但我想了解如何纠正我的 XSD 文件,以便 JAXB 类创建工具自动纠正上述问题。我认为我的 XSD 定义犯了一个错误,导致了这个问题。我经常修改 XSD 文件,但无法每次都手动进行所有这些更改。
最佳答案
我尝试了你的架构,并得到了 ActorDef
类,与你相同:
@XmlElement(name = "actor-system", required = true)
protected ActorSystemType actorSystem;
public ActorSystemType getActorSystem() { return actorSystem; }
public void setActorSystem(ActorSystemType value) { this.actorSystem = value; }
但是后来我删除了你架构的这一部分(因为你似乎没有使用它 - 为什么它在那里?):
<xsd:complexType name="actor-system-type">
<xsd:attribute name="name" type="xsd:IDREF" use="required" />
</xsd:complexType>
然后将 actor-system
元素的 type
更改为:
<xsd:element name="actor-system" type="tns:actor-system-type"/>
致:
<xsd:element name="actor-system" type="tns:actor-system-def"/>
因此,结束模式变为:
<xsd:element name="policy">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="actor-def" type="tns:actor-def"/>
<xsd:element name="actor-system-def" type="tns:actor-system-def"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="actor-def">
<xsd:sequence>
<xsd:element name="actor-system" type="tns:actor-system-def"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:ID" use="required" />
</xsd:complexType>
<xsd:complexType name="actor-system-def">
<xsd:attribute name="name" type="xsd:ID" use="required" />
<xsd:attribute name="url" type="xsd:anyURI" use="required" />
</xsd:complexType>
然后使用这个,我生成了类并得到了 ActorDef
的内容:
@XmlElement(name = "actor-system", required = true)
protected ActorSystemDef actorSystem;
public ActorSystemDef getActorSystem() { return actorSystem; }
public void setActorSystem(ActorSystemDef value) { this.actorSystem = value; }
在我看来,这就是您最初所期待的,对吧?
此外,正如应该的那样,不再生成 ActorSystemType.java
。
关于java - JAXB 中的 XML IDREF 返回错误的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16050709/
根据其架构验证我的 XML 文件时,我收到此错误消息。谁能建议可能出了什么问题? XML 文件是: Al Frank Smith Henry Smith 架构是:
XSD中IDREF和IDREFS有什么区别? 我知道它们都引用了 ID 属性,但有什么区别?什么时候使用它们? 最佳答案 IDREF 类型的属性是对其他具有 ID 类型属性的元素的引用。 IDREFS
我正在编写一个 XML 文档并试图说明它的规范。 我认为我可以指定一个标签的属性可以限制为另一个标签的属性,我认为可以使用 !ATTLIST 的 IDREF,但我不太确定。示例:
我有一个 spring.xml 定义如下: Point 类
我使用的是标准 xml 模式,称为 isosts,我需要使用 jaxb 将模式转换为 java 类。在此 xml 架构中,许多元素的属性 rod 类型为 xs:IDREFS 。 Jaxb 将 xs:
鉴于 spring.xml 的以下代码,它发现 idref 有问题......请解释一下
我最终成功地摆弄了 HyperJAXB,以便当 XSD 具有复杂类型 A 并且具有复杂类型 B 的 IDREF 时,HyperJAXB 将在两个生成的实体之间生成 @OneToOne JPA 注释。
我正在阅读和测试 XQuery 以及我使用 BaseX(www.basex.org) 和 saxon-HE 9.4.0.6N 的类似测试工具。 对于以下简单的 XML 文件 - 没有附加到 sampl
我有这样的元素 当电机元件在当前文档中时,它工作正常。 但是当我想从另一个文件导入电机元素时 Intell
有没有一种简单的方法可以使用 IDREF 属性来引用不同 XML 文档中的元素?如果没有,关于如何以不同方式做的任何建议?我想做的是为桌面 RPG 制作数字字符表,我希望包含所有字符特定信息的 XML
我为我的 xml 元素使用全局唯一标识符 (GUID),架构如下所示: 和这样的 xml 元素: 对应的 xsd 架构: 我想在另一个元素
给定一些示例 data.xml 文件: Google
我有一个 XML 架构:-
W3C XSD 1.0 Part 2: Datatypes规范是指 W3C XML 1.0 ID 和 IDREF 类型的定义规范,但这些文档都没有定义对这些类型值的长度的任何限制。 但是,似乎某些 X
我对 XSD 设计和 JAXB 都是新手。我成功创建了 XSD,如下所示:
我正在使用 xjc 从 XML 模式生成 Java 对象。我想使用 IDREF 在文档中多次引用相同的元素。我还想将 IDREF 引用的对象限制为特定类型。我想这样做是为了模式验证,但也是为了在 Ja
我正在寻找一个 XSD,它将用于通过 JAXB 生成一些 Java 类。我希望生成的 XML 看起来像这样: Bob Smith Some Appointment Type
我有一个如下所示的 XML 结构: [...] id_1001_0 23 Apple [...] 我想使用 Linq to XML 将其读入(非匿
我应该如何在 XMLSchema 中使用 ID/IDREFS,以便通过 xsl:key 和 xpath 函数 key() 和 id() 将它用于 XSL 转换? 如果我使用下面的 DTD 一切都很好
]> Snow Crash Neal Stephenson JDom 是否有能力执行以下操作: Element root
我是一名优秀的程序员,十分优秀!