Карта Джексона XmlMapper XML атрибут вложенного элемента - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь разобрать XML в Java класс и затем отправить его на внешний интерфейс. Я использую Springboot 2.2.5, формат данных Jackson xml 2.10.2

У меня есть следующий XML файл:

<root xmlsn="...">
  <result status="1" outs="6" val="0" pic="7"/>
</root>

Я ожидаю этот ответ от бэкэнда во внешнем интерфейсе:

{
  status: 1,
  outs: 6,
  val: 0
  pic: 7
}

Ну, это очень просто.

Посмотрим, что у меня есть:

Класс для элемента root:

@JacksonXmlRootElement(namespace = "...", localName = "root")
public class SetXmlResponseDto {

    @JacksonXmlProperty(localName = "result")
    private ResultPropertyDto result;
}

И затем класс для элемента результата ResultPropertyDto:

public class ResultPropertyDto {

    @JacksonXmlProperty(localName = "val", isAttribute = true)
    private String value;

    @JacksonXmlProperty(localName = "status", isAttribute = true)
    private String status;
}

// Я удалил некоторые части кода для пивоварения (сеттер, геттер)

Но результат этого следующий:

{
  result: {
    status: 1,
    ....
  }
}

Вероятно, хорошо бы также упомянуть, как я его строю?

ObjectMapper objectMapper = new XmlMapper();
objectMapper().readValue(new URL(urlAddress), SetXmlResponseDto.class);

Конечно, я мог бы просто позвонить SetXmlResponseDto.getStatus() перед отправкой его во внешний интерфейс, и вывод будет точно таким же ожидается, но мне было интересно, есть ли способ, как достичь требуемого результата без создания подкласса ResultPropertyDto ??

Представьте, что вы вложили 4 раза в элемент XML и хотите отобразить только 1 атрибут этого вложенного элемента. Я должен был бы создать 4 класса для этого ??

Спасибо за ответы

1 Ответ

0 голосов
/ 17 апреля 2020

Если вы хотите избежать создания глубоко вложенных структур, вы всегда можете использовать xpath .

Из упомянутой справочной документации:

рассмотрите следующий виджет . xml file

<widgets>
  <widget>
     <manufacturer/>
     <dimensions/>
  </widget>

Элемент можно выбрать с помощью следующего кода XPath API:

// parse the XML as a W3C Document
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(new File("/widgets.xml"));

XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "/widgets/widget";
Node widgetNode = (Node) xpath.evaluate(expression, document, XPathConstants.NODE);

Со ссылкой на элемент теперь можно написать относительное выражение XPath для выбора дочернего элемента:

XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "manufacturer";
Node manufacturerNode = (Node) xpath.evaluate(expression, widgetNode, XPathConstants.NODE);
...