首页 > 解决方案 > Jackson XmlMapper 映射嵌套元素的 XML 属性

问题描述

我正在尝试将 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
}

嗯,这非常容易。

让我们看看,我有什么:

根元素的类:

@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;
}

// 我删除了 brewity (setter,getter) 的部分代码

但是这样做的结果如下:

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

还可以提一下我是如何构建它的?

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

当然,我可以SetXmlResponseDto.getStatus()在将它发送到前端之前调用它,输出将完全符合预期,但我想知道,有没有办法在不创建子类的情况下实现所需的结果ResultPropertyDto

想象一下,您在 XML 中有 4 次嵌套元素,并且只想映射这个嵌套元素的 1 个属性。我必须为此创建4个类?

感谢您的回答

标签: javaspring-bootjackson-dataformat-xml

解决方案


如果您想避免创建深层嵌套结构,您始终可以使用xpath

从提到的文档参考:

考虑以下 widget.xml 文件

<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);

推荐阅读