2013-03-14 63 views
2

我使用JAXB將XSD模式綁定到POCO。我已經嘗試兩種不同的方式來寫XSD架構但每個有一個缺陷:使用xsd:序列的醜陋java代碼

選項1

問題:每個元素被表示在XML而不是<Element><Elements>,再加上它們不是一個容器,例如內部<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> 

的Java

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

封送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> 

的Java

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

封送XML

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

問題:有沒有一種方法可以編寫輸出XML的模式,如選項2和其代碼寫入如選項1

編輯:<xs:list>不是一個選項,因爲元素可能有空格。

回答

1

如果從Java開始從Java類

啓動對象,你可以使用@XmlElementWrapper註釋添加分組元素。

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

從XML模式

開始XJC工具是非常可擴展性。爲XJC工具編寫的以下插件似乎允許您在模型中生成@XmlElementWrapper註釋。

+0

我從架構開始。我不希望每次從模式生成POCO時都要更改代碼。 – mostruash 2013-03-14 20:16:16

+0

@mostruash - 我已經用可能有幫助的鏈接更新了我的答案。 – 2013-03-14 20:19:15

+0

感謝您的簡潔回答。然而,這個解決方案似乎並沒有產生一個XML,其中''標籤位於''內。仔細想想,如果不爲POCO自動生成自定義吸氣器,則可能無法這樣做。 – mostruash 2013-03-14 20:27:52