嵌套元素的Jackson XmlMapper映射XML属性

时间:2020-04-17 08:52:52

标签: java spring-boot jackson-dataformat-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;
}

///我删除了一些代码,以确保酿造性(setter,getter)

但是结果如下:

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

也提一下我是如何建造它的呢?

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

当然,我可以在将SetXmlResponseDto.getStatus()发送到前端之前调用它,然后输出将完全符合预期,但是我想知道是否有一种方法可以在不创建子类{{ 1}} ??

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

感谢您的回答

1 个答案:

答案 0 :(得分:0)

如果您想避免创建深层嵌套的结构,则可以始终使用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);
相关问题