gpt4 book ai didi

java - JAXB 中的 XML IDREF 返回错误的类?

转载 作者:太空宇宙 更新时间:2023-11-04 07:41:07 26 4
gpt4 key购买 nike

我对 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com