Подтвердить что ты не робот

Конвертировать xml в java-объект с помощью jaxb (unmarshal)

У меня есть следующий 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>

Я не уверен, каким будет мое pojo, когда я использую JAXB для его преобразования.

Я создал следующие 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;
    }
}

Пожалуйста, помогите мне. Спасибо заранее.

4b9b3361

Ответ 1

Испытания

В классе 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​​STRONG >

В этом классе я использовал аннотацию @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;
    }
}

Demo

Ниже приведен пример использования API-интерфейсов JAXB для чтения (без подделки) 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);
    }

}