Unmarshall xml - основной класс становится нулевым - PullRequest
1 голос
/ 23 февраля 2020

У меня есть xml Мне нужно разобрать:

 <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE nitexp SYSTEM "http://www.nitml.org/nitexp/1.0/nitexp.dtd" [<!ENTITY % nitcml SYSTEM "http://www.nitml.org/nitcml/1.0/nitcml.dtd" > %nitcml;]>
    <nitexp xmlns="http://www.nitml.org/nitexp/1.0">
    <item type="sasa">
    <nd>nitl20043581</nd>
    <source>
    <name>name</name>
    <issue>
    <publicdate>20200210</publicdate>
    <page>32</page>
    <column></column>
    </issue>
    </source>
    <title>Immof inanz </title>
    <author>hshsa</author>
    <annotation>
    <nitcml xmlns="http://www.nitml.org/nitcml/1.0">
    </nitcml>
    </annotation>
    <content>
    <nitcml xmlns="http://www.nitml.org/nitcml/1.0">
    <body><p><l>dsadasdasd</l><l>dasdasd</l><l> dasdas</l><l></l></p></body>
    </nitcml>
    </content>
    <nmms><importdate>20200210</importdate>
    <topic code="np01"/>
    <mark> </mark>
    <useraction></useraction>
    <weight></weight>
    <group></group><attachments></attachments><note>
    <nitcml xmlns="http://www.nitml.org/nitcml/1.0"></nitcml></note>
    <translation><nitcml xmlns="http://www.nitml.org/nitcml/1.0"></nitcml>
    </translation>
    <field>
    <value>ni</value>
    <value>20a04</value>
    <value>358d1</value>
    </field>
    </nmms>
    </item>
    </nitexp>

Я могу сделать это просто, но когда я попробую на другой стороне, я получу нулевой предмет. Мой основной класс:

  @Builder
@AllArgsConstructor
@NoArgsConstructor
@Setter
@ToString
@XmlRootElement(name = "nitexp", namespace="http://www.nitml.org/nitexp/1.0")
public class Article {

    private Item item = Item.builder().build();

    @XmlElement(name = "item")
    public ArticleItem getItem() {
        return item;
    }

}

, затем

  @Builder
@AllArgsConstructor
@NoArgsConstructor
@Setter
@ToString
@XmlType(propOrder={"type","nitoid","source","title","author","annotation","content","nmms"})
public class ArticleItem {

    private String type;
    private String nitoid;
    private ArticleSource source = new ArticleSource();
    private String title;
    private String author;
    private String annotation;
    private String content;
    private String nmms;


    @XmlAttribute(name = "type")
    public String getType() {
        return type;
    }

... и так далее.

Я работаю с Java 12, у меня есть jaxb- api и glassfi sh .jaxb в моих зависимостях pom. Я пытался поместить аннотации @XMLElement на геттеры и сеттеры. Я попытался поместить аннотацию XMLRootElement в каждый вложенный класс, но безуспешно. Я также пытался не использовать @Builder и не инициализировать объекты классов. Я даже пытался изменить свой xml и вырезать второй ряд, но это не проблема. Сейчас я даже не знаю, что я могу сделать по-другому, что изменить и как изучить, где могут быть возможные проблемы. Буду благодарен за любые предложения, идеи. Спасибо!

1 Ответ

1 голос
/ 24 февраля 2020

У меня сработала следующая настройка:

Класс статьи:

@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "nitexp", namespace="http://www.nitml.org/nitexp/1.0")
public class Article {

    @XmlElement(name = "item", namespace="http://www.nitml.org/nitexp/1.0")
    private ArticleItem  item;

}

Класс ArticleItem:

@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "item", namespace="http://www.nitml.org/nitexp/1.0")
public class ArticleItem {

    @XmlAttribute
    private String type;

    @XmlElement(name = "nd", namespace="http://www.nitml.org/nitexp/1.0")
    private String nitoid;

    @XmlElement(name = "title", namespace="http://www.nitml.org/nitexp/1.0")
    private String title;

    @XmlElement(name = "author", namespace="http://www.nitml.org/nitexp/1.0")
    private String author;

}

Процесс демаршаллинга:

    Unmarshaller unmarshaller = JAXBContext.newInstance(Article.class).createUnmarshaller();
    StringReader reader = new StringReader(data);
    Object obj = unmarshaller.unmarshal(new StreamSource(reader));
    System.out.println(obj);

Вывод:

Article(item=ArticleItem(type=sasa, nitoid=nitl20043581, title=Immof inanz , author=hshsa))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...