JAXB unmarshall Смешанный контент - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь проанализировать существующие XML файлы для приложения java, и некоторые элементы иногда смешивают содержимое, как показано ниже:

XML_STRING

<root>
  <name>Michael</name>
  <question>Text here</question>
</root>

XML_STRING_2

<root>
  <name>Michael</name>
  <question>Text here<measure>More Text</measure></question>
</root>

Я сделал следующие классы, чтобы разобрать эти данные.

Root Класс

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root implements Serializable
{
    private String name;
    private Question question;
}

Класс вопроса

@XmlAccessorType(XmlAccessType.NONE)
public class Question implements Serializable
{
    @XmlValue
    private String questionText;
    private String measure;
}

I Кажется, невозможно получить как Text Here, так и More Text для хранения внутри класса Question.

JAXBContext.newInstance(Root.class)
  .createUnmarshaller()
  .unmarshal(new ByteArrayInputStream(XML_STRING_2.getBytes("UTF-8")));

Я печатаю результат из приведенного выше фрагмента кода (с * 1023 от Lombok * добавлены аннотации к Root и Question) для XML_STRING и XML_STRING_2.

XML_STRING : Root(name=Michael, question=Question(questionText=Text here, measure=null)) XML_STRING_2 : Root(name=Michael, question=Question(questionText=, measure=null))

1 Ответ

0 голосов
/ 30 марта 2020

Я смог получить что-то, с чем мог бы работать, используя @XmlMixed вместе с @XmlElementRefs внутри Question и создав класс Measure.

@XmlAccessorType(XmlAccessType.NONE)
public class Question implements Serializable
{
    @XmlMixed
    @XmlElementRefs({
        @XmlElementRef(name = "measure", type=Measure.class)
    })
    private List<?> content;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="measure") // If this is removed I get the error: "Invalid @XmlElementRef : Type `Measure` or any of its subclasses are not known to this context."
public class Measure
{
    @XmlValue
    private String value;
}

Я теперь получаю приведенный ниже вывод, который я могу использовать с помощью instanceof проверки элементов внутри content

Root(name=Michael, question=Question(content=[Text here]))
Root(name=Michael, question=Question(content=[Text here, Measure(value=More Text)]))

Файл Root остался без изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...