【发布时间】:2014-09-29 19:49:27
【问题描述】:
我正在使用JAXB 生成代码,以使用xsd 文件的原理图将xml 解组为java 实体。问题是生成的代码不会生成以下 xml 中指定的 organization 的 name:
<organization>
<name>Some organization's name goes here</name>
</organization>
这是Organization数据类型的xsd定义:
<xs:complexType name="Organization">
<xs:sequence>
<xs:element name="name" type="ON" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="classCode" type="EntityClassOrganization" use="optional" fixed="ORG"/>
</xs:complexType>
这是xsd 数据类型的ON 定义:
<xs:complexType name="ON" mixed="true">
<xs:annotation>
<xs:documentation>
A name for an organization. A sequence of name parts.
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="delimiter" type="en.delimiter"/>
<xs:element name="prefix" type="en.prefix"/>
<xs:element name="suffix" type="en.suffix"/>
</xs:sequence>
<xs:attribute name="use" use="optional" type="set_EntityNameUse">
<xs:annotation>
<xs:documentation>
A set of codes advising a system or user which name
in a set of like names to select for a given purpose.
A name without specific use code might be a default
name useful for any purpose, but a name with a specific
use code would be preferred for that respective purpose.
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
这是JAXB创建的java代码:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ON", propOrder = {"content"})
public class ON {
@XmlElementRefs({
@XmlElementRef(name = "delimiter", namespace = "urn:something", type = JAXBElement.class),
@XmlElementRef(name = "prefix", namespace = "urn:something", type = JAXBElement.class),
@XmlElementRef(name = "suffix", namespace = "urn:something", type = JAXBElement.class)
})
@XmlMixed
protected List<Serializable> content;
@XmlAttribute(name = "use")
protected List<String> use;
public List<Serializable> getContent() {
if (content == null) {content = new ArrayList<Serializable>();}
return this.content;
}
public List<String> getUse() {
if (use == null) {use = new ArrayList<String>();}
return this.use;
}
}
这个生成的 java 类有几个问题。首先,它创建List<Serializable> content;,而不是为delimiter、prefix 和suffix 创建单独的属性。同样重要的是,它也无法让我访问顶部 xml 中 name 标记内的文本值。当我从 xsd 文件中的 ON 定义中删除 mixed="true" 时,内容列表将替换为 delimiter、prefix 和 prefix 和 suffix 的单独属性,但我仍然无法获取文本name 元素的内容。我对删除 mixed=true 犹豫不决,因为我读到 mixed=true 指定 complextype 可以包含 elements、attributes 和 text。
除了为每个其他元素/属性生成单独的方法之外,我如何更改上面的代码以便生成检索name 元素文本的方法?
【问题讨论】: