JAXB:解组时未定义的 id“”
JAXB: undefined id "" when unmarshal
说我的 xml 应该如下所示:
<!-- even I move <A id="2">...</A> here, still has this error-->
<A id="1">
...
... (many levels of nested element)
<C>
<B ref="2"/>
</C>
...
</A>
<A id="2">...</A>
所以我定义了以下xsd文件:
<xs:complexType name="A" abstract="true">
<xs:attribute name="id" type="xs:ID" use="required"/>
...
</xs:complexType>
<xs:complexType name="B">
<xs:attribute name="ref" type="xs:IDREF" use="required"/>
</xs:complexType>
但是当我想使用 JAXB 解析这个 xml 文件时,它总是抱怨 <B ref="2"/>
有一个错误:
Undefined ID "".
我的代码:
public class A {
private String id;
@XmlAttribute
@XmlID
public String getId() {
return id;
}
...
}
public class C {
private A b;
@XmlIDREF
@XmlElement
public A getB() {
return b;
}
}
那么问题是什么?
经过一整天的查找和试验,终于找到错误并解决了:
classC
实际拥有的不是直接A
的ref,而是classB
只有一个ref。所以现在解决方案很清楚:
要么将 xsd 更改为:
<xs:complexType name="C">
<xs:choice>
<xs:element name="B" type="xs:IDREF"/>
</xs:choice>
</xs:complexType>
或更改 java 代码:
public class C {
private B b;
...
}
// addint a B class which contains the reference
public class B {
private A b;
@XmlIDREF
@XmlElement
public A getB() {
return b;
}
}
如果你对我如何解决这个问题感兴趣,你可以参考my blog。
说我的 xml 应该如下所示:
<!-- even I move <A id="2">...</A> here, still has this error-->
<A id="1">
...
... (many levels of nested element)
<C>
<B ref="2"/>
</C>
...
</A>
<A id="2">...</A>
所以我定义了以下xsd文件:
<xs:complexType name="A" abstract="true">
<xs:attribute name="id" type="xs:ID" use="required"/>
...
</xs:complexType>
<xs:complexType name="B">
<xs:attribute name="ref" type="xs:IDREF" use="required"/>
</xs:complexType>
但是当我想使用 JAXB 解析这个 xml 文件时,它总是抱怨 <B ref="2"/>
有一个错误:
Undefined ID "".
我的代码:
public class A {
private String id;
@XmlAttribute
@XmlID
public String getId() {
return id;
}
...
}
public class C {
private A b;
@XmlIDREF
@XmlElement
public A getB() {
return b;
}
}
那么问题是什么?
经过一整天的查找和试验,终于找到错误并解决了:
classC
实际拥有的不是直接A
的ref,而是classB
只有一个ref。所以现在解决方案很清楚:
要么将 xsd 更改为:
<xs:complexType name="C">
<xs:choice>
<xs:element name="B" type="xs:IDREF"/>
</xs:choice>
</xs:complexType>
或更改 java 代码:
public class C {
private B b;
...
}
// addint a B class which contains the reference
public class B {
private A b;
@XmlIDREF
@XmlElement
public A getB() {
return b;
}
}
如果你对我如何解决这个问题感兴趣,你可以参考my blog。