首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jaxb将xml转换为java对象(解组)

使用jaxb将xml转换为java对象(解组)
EN

Stack Overflow用户
提问于 2012-06-27 15:13:41
回答 1查看 126.6K关注 0票数 38

我有下面的XML,我需要把它转换成一个java对象。

代码语言:javascript
复制
<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是什么。

根据我的理解,我创建了以下POJO:

代码语言:javascript
复制
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;
    }
}

请帮帮我。提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2012-06-27 17:55:36

测试

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

代码语言:javascript
复制
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属性。出于与Tests类相同的原因,我还使用了@XmlElement注释。

代码语言:javascript
复制
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读取(解组) XML并填充域模型,然后将结果写(编组)回XML。

代码语言:javascript
复制
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);
    }

}
票数 130
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11221136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档