Удалите строку XML в объект Java с помощью JAXB - PullRequest
0 голосов
/ 08 октября 2018

Я хочу преобразовать приведенную ниже XML-строку в объект Java с использованием JAXB.

Я могу преобразовать объект, но documents после unmarshall приходит как null.Result [hits=1, tookInMillis=10, totalHits=1, documents=null] Как исправить documents объект для получения значений?

XML String:

<result hits="1" tookInMillis="9" totalHits="1" xmlns="http://www.example.com/search/result/1.0">
   <documents>
      <document id="1" company="TEST" type="CN" generationDate="2018-05-24T06:05:37.000Z">
         <field type="xs:string" name="test1">test1</field>
         <field type="xs:string" name="test2">test2</field>
         <field type="xs:string" name="test3">test3</field>
         <field type="xs:string" name="test4">test4</field>
         <field type="xs:string" name="test5">test5</field>
         <field type="xs:string" name="test6">test6</field>
         <field type="xs:string" name="test7">test7</field>
         <field type="xs:string" name="test8">test8</field>
         <field type="xs:date" name="date">2018-05-23</field>
      </document>
   </documents>
</result>

1 Ответ

0 голосов
/ 08 октября 2018

Вы должны быть осторожны с пространствами имен XML.

В XML пространство имен, данное в элементе XML (как в <result>), наследует его дочерние элементы (<documents>, <document> и <field>).

В Java это не так.Поэтому вам нужно явно указать пространство имен в аннотациях @XmlElement и @XmlElementWrapper дочерних свойств.

Следующие классы Java работают нормально при демаршаллинге вашего примера XML.В частности, коллекции Result.documents и Document.fields не входят в число null.

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "result", namespace = "http://www.example.com/search/result/1.0")
public class Result {

    @XmlAttribute
    private int hits;

    @XmlAttribute
    private int tookInMillis;

    @XmlAttribute
    private int totalHits;

    @XmlElementWrapper(name = "documents", namespace = "http://www.example.com/search/result/1.0")
    @XmlElement(name = "document", namespace = "http://www.example.com/search/result/1.0")
    private List<Document> documents;

    // ... public getters and setters (omitted for brevity)
}
@XmlAccessorType(XmlAccessType.FIELD)
public class Document {

    @XmlAttribute
    private int id;

    @XmlAttribute
    private String company;

    @XmlAttribute
    private String type;

    @XmlAttribute
    private Date generationDate;

    @XmlElement(name = "field", namespace = "http://www.example.com/search/result/1.0")
    private List<Field> fields;

    // ... public getters and setters (omitted for brevity)
}
...