XML Java - как игнорировать внешние оболочки при разборе? - PullRequest
2 голосов
/ 04 апреля 2019

Ответ XML от API, я хочу разобрать, выглядит примерно так:

<Envelope>
   <Body>
      <RESULT>
          <SUCCESS>TRUE</SUCCESS>
          <EMAIL>somebody@domain.com</EMAIL>
          ... more stuff...
      </RESULT>
   </Body>
</Envelope>

Я хочу получить поля RESULT в объекте.

Я мог бы создать 3 класса, один для конверта с телом в нем, один для тела с результатом в нем и один для результата. Но есть ли ярлык?

например. просто создайте объект для данных результата следующим образом:

@JacksonXmlRootElement(localName = "Envelope/Body/RESULT")
public class Result {
    @JacksonXmlProperty(localName = "SUCCESS")
    private boolean success;
    @JacksonXmlProperty(localName = "EMAIL")
    private String Email;
    :
}

Я бы выполнил разбор в такой строке:

return theXmlMapper.readValue(resultPayload, Result.class);

1 Ответ

2 голосов
/ 05 апреля 2019

Вы можете прочитать XML как дерево, найти нужный узел и преобразовать его, используя метод treeToValue. Пример:

XmlMapper xmlMapper = new XmlMapper();
xmlMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

JsonNode root = xmlMapper.readTree(xmlFile);
JsonNode node = root.at("/Body/RESULT");
Result result = xmlMapper.treeToValue(node, Result.class);
Значение

TRUE по умолчанию не анализируется как Boolean, поэтому вам необходимо написать собственный десериализатор.

Это решение имеет ограничения , которые @ M. Джастин указывает в своем комментарии:

В соответствии с документацией формата данных Jackson XML «Модель дерева - это только поддерживается ограниченным образом и его использование рекомендуется против: древовидная модель основана на информационной модели JSON, не соответствует XML Infoset ". Это означает, что подход readTree, как правило, не должен использоваться при разборе XML. Например, модель дерева упадет повторяющиеся элементы с одинаковыми именами, например при использовании их для моделирования список, такой как:

<items><item><id>1</id></item><item><id>2</id></item></items>
...