使用xsd:sequence的丑陋java代码

时间:2013-03-14 20:12:06

标签: java xsd jaxb

我使用JAXB将XSD架构绑定到POCO。我尝试了两种不同的方法来编写XSD架构,但每种方法都有一个缺陷:

选项1

问题:每个元素都用XML中的<Elements>表示,而不是<Element>,而且它们不在<ElementsContainer>等容器中。

XSD架构

<xs:element name="Root" type="RootType" />

<xs:complexType name="RootType" />
  <xs:sequence>
    <xs:element name="Elements" type="xs:string" maxOccurs="unbounded"/>
  </xs:sequence>
</xs:complexType>

爪哇

RootType r = new RootType();
r.getElements.add("Str1");
r.getElements.add("Str2");

Marshaled XML

<Root>
  <Elements>Str1</Elements> 
  <Elements>Str2</Elements>
</Root>
选项2

问题:Java代码看起来很丑。

XSD架构

<xs:element name="Root" type="RootType" />

<xs:complexType name="RootType" />
  <xs:element name="Elements">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Element" type="xs:string" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:complexType>

爪哇

RootType r = new RootType();
r.getElements().getElement().add("Str1");
r.getElements().getElement().add("Str2");

Marshaled XML

<Root>
  <Elements>
    <Element>Str1</Element>
    <Element>Str2</Element>
  </Elements>
</Root>

问题:有没有办法编写输出XML的模式,如选项2 ,其代码的编写方式与选项1

编辑: <xs:list>不是选项,因为元素可能包含空格。

1 个答案:

答案 0 :(得分:1)

从Java类开始

如果从Java对象开始,可以使用@XmlElementWrapper注释添加分组元素。

@XmlElementWrapper(name="Elements")
@XmlElement(name="Element)
public List<Element> getElements() {
    return elements;
}

从XML架构开始

XJC工具非常易于扩展。为XJC工具编写的以下插件似乎允许您在模型中生成@XmlElementWrapper注释。