简体   繁体   English

使用jaxb(unmarshal)将xml转换为java对象

[英]convert xml to java object using jaxb (unmarshal)

I have the following XML and I need to convert it into a java object. 我有以下XML,我需要将其转换为Java对象。

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

I am not sure what will be my pojo when I use JAXB to convert it. 我不确定使用JAXB将其转换为pojo时会怎样。

I created the following POJOs as per my understanding: 根据我的理解,我创建了以下POJO:

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;
    }
}

Please help me. 请帮我。 Thanks in advance. 提前致谢。

Tests 测验

On the Tests class we will add an @XmlRootElement annotation. Tests类上,我们将添加一个@XmlRootElement批注。 Doing this will let your JAXB implementation know that when a document starts with this element that it should instantiate this class. 这样做将使您的JAXB实现知道在文档以此元素开头时,它应实例化该类。 JAXB is configuration by exception, this means you only need to add annotations where your mapping differs from the default. JAXB是例外配置,这意味着您只需要在映射与默认值不同的地方添加注释。 Since the testData property differs from the default mapping we will use the @XmlElement annotation. 由于testData属性与默认映射不同,因此我们将使用@XmlElement批注。 You may find the following tutorial helpful: http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted 您可能会发现以下教程很有用: 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 测试数据

On this class I used the @XmlType annotation to specify the order in which the elements should be ordered in. I added a testData property that appeared to be missing. 在此类上,我使用了@XmlType批注来指定元素的订购顺序。我添加了一个似乎缺少的testData属性。 I also used an @XmlElement annotation for the same reason as in the Tests class. 出于与Tests类相同的原因,我还使用了@XmlElement批注。

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;
    }
}

Demo 演示版

Below is an example of how to use the JAXB APIs to read (unmarshal) the XML and populate your domain model and then write (marshal) the result back to XML. 下面是一个示例,说明如何使用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);
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM