2012-06-27 54 views
32

我有以下XML,我需要将它转换为java对象。使用jaxb将xml转换为java对象(unmarshal)

<tests> 
    <test-data> 
     <title>BookTitle</title> 
     <book>BookName</book> 
     <count>64018</count> 
     <test-data> 
      <title>Book title1</title> 
      <book>Book Name1</book> 
      <count>5</count> 
     </test-data> 
     <test-data> 
      <title>Book title2</title> 
      <book>Book Name3</book> 
      <count>5</count> 
     </test-data> 
     <test-data> 
      <title>Book title3</title> 
      <book>Book Name3</book> 
      <count>4</count> 
     </test-data> 
    </test-data> 
</tests> 

我不确定当我使用JAXB将其转换时,我的pojo将会是什么。

我创建了以下的POJOs按我的理解:

public class Tests { 

    TestData testData; 

    public TestData getTestData() { 
     return testData; 
    } 

    public void setTestData(TestData testData) { 
     this.testData = testData; 
    } 
} 

public class TestData { 
    String title; 
    String book; 
    String count; 

    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    public String getBook() { 
     return book; 
    } 
    public void setBook(String book) { 
     this.book = book; 
    } 
    public String getCount() { 
     return count; 
    } 
    public void setCount(String count) { 
     this.count = count; 
    } 
} 

请帮助我。 在此先感谢。

+2

你不确定,好。但你有没有尝试过什么?如果您已经完成了某项工作,则更容易提供帮助。 – buc

+2

如果您拥有此XML的XSD,则可以使用Eclipse等IDE来生成JAXB注释类。 –

回答

116

测试

Tests类,我们将增加一个@XmlRootElement注解。这样做会让你的JAXB实现知道当一个文档以这个元素开始时它应该实例化这个类。 JAXB通过例外进行配置,这意味着只需要在映射不同于默认值的地方添加注释。由于testData属性与默认映射不同,我们将使用@XmlElement注释。您可能会发现下面的教程有帮助:http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted

package forum11221136; 

import javax.xml.bind.annotation.*; 

@XmlRootElement 
public class Tests { 

    TestData testData; 

    @XmlElement(name="test-data") 
    public TestData getTestData() { 
     return testData; 
    } 

    public void setTestData(TestData testData) { 
     this.testData = testData; 
    } 

} 

TESTDATA

在这一类我用@XmlType批注,以指定的要素应责令顺序我加了testData属性,似乎失踪了。我也使用@XmlElement注释的原因与Tests类相同。

package forum11221136; 

import java.util.List; 
import javax.xml.bind.annotation.*; 

@XmlType(propOrder={"title", "book", "count", "testData"}) 
public class TestData { 
    String title; 
    String book; 
    String count; 
    List<TestData> testData; 

    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    public String getBook() { 
     return book; 
    } 
    public void setBook(String book) { 
     this.book = book; 
    } 
    public String getCount() { 
     return count; 
    } 
    public void setCount(String count) { 
     this.count = count; 
    } 
    @XmlElement(name="test-data") 
    public List<TestData> getTestData() { 
     return testData; 
    } 
    public void setTestData(List<TestData> testData) { 
     this.testData = testData; 
    } 
} 

演示

下面是如何使用JAXB API来读取(解组)的XML和填充您的域模型,然后写(元帅)的结果返回给XML的例子。

package forum11221136; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Tests.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum11221136/input.xml"); 
     Tests tests = (Tests) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(tests, System.out); 
    } 

} 
+24

如果你阅读它,你应该接受这个答案。 –

+0

将XML解析为不带模式的Java对象 - 使用反射?如果是的话,反思在解组中的作用是什么? – Viswa