2011-09-06 103 views
1

我正在使用JAXB,无法弄清楚为什么我的嵌套对象没有被解组。我正在通过XJC命令生成类。使用JAXB解组嵌套对象

例如,当我解组Works集合对象时,Composers集合总是包含一个Composer实例将一个NULL名称。

我的XML看起来是这样的:

<Works> 
    <Work> 
     <Composer> 
      <Name>Test Name</Name> 
     </Composer> 
    </Work> 
</Works> 

和XSD是这样的:

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
jxb:version="2.0" xmlns:tns="http://www.example.org/test/" 
targetNamespace="http://www.example.org/test/"> 

<element name="Works" type="tns:Work"></element> 

<complexType name="Work"> 
    <sequence> 
     <element name="Composers" type="tns:Composer" maxOccurs="unbounded" 
      minOccurs="1"> 
     </element> 
    </sequence> 
</complexType> 


<complexType name="Composer"> 
    <sequence> 
     <element name="Name" type="string"> 
     </element> 
    </sequence> 
</complexType> 

而且我的代码,做解组:

JAXBContext jc = JAXBContext.newInstance("mypackagename"); 
    Unmarshaller um = jc.createUnmarshaller(); 
    Works works = (Works)um.unmarshal(new FileReader("src/main/resources/works.xml")); 
    Work work = works.getWorks().get(0); 
    Composer composer = work.getComposers().get(0); 
    System.out.println(composer.getName()); 

名称始终为NULL,即使我知道它有价值。

+2

我认为XML实例,应该是'测试'每xsd,而不是像你提到的那个 – Cratylus

+0

对不起,我的部分有轻微的错字,当我检索作曲家时,它会是work.getComposers()not works.getCompose r() - 我修改了代码。 – seedhead

+0

@seedhead - 您已将Works元素定义为“Work”类型,不包含元素“Work”。 –

回答

2

你可以有一个像XML架构:

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    jxb:version="2.0" xmlns:tns="http://www.example.org/test/" 
    targetNamespace="http://www.example.org/test/"> 

    <element name="Works" type="tns:Works"></element> 

    <complexType name="Works"> 
     <sequence> 
      <element name="Work" type="tns:Work" maxOccurs="unbounded"/> 
     </sequence> 
    </complexType> 

    <complexType name="Work"> 
     <sequence> 
      <element name="Composer" type="tns:Composer" maxOccurs="unbounded"/> 
     </sequence> 
    </complexType> 


    <complexType name="Composer"> 
     <sequence> 
      <element name="Name" type="string"/> 
     </sequence> 
    </complexType> 

</schema> 

对应于以下XML:

<Works xmlns="http://www.example.org/test/"> 
    <Work> 
     <Composer> 
      <Name>Test Name</Name> 
     </Composer> 
    </Work> 
</Works> 
+0

在你的上面的示例架构中,不应该是 not ? – seedhead

+0

@seedhead - 你是对的,我已经对XML模式进行了修改。 –

+0

谢谢。我尝试了你的xsd,现在我解开这个问题时:javax.xml.bind.UnmarshalException:意外元素(uri:“http://www.example.org/test/”,local:“Works”)。预期的元素是(无) – seedhead