You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Jackson库在XML转JsonNode时忽略属性?

使用Jackson忽略XML属性并完成XML↔JsonNode转换

Jackson完全支持忽略XML属性,你可以通过配置XmlMapper的特性实现,同时需要修正当前转换流程里的错误(比如用ObjectMapper转XML是不对的,XML相关操作要始终用XmlMapper)。

1. 核心配置:让XmlMapper忽略XML属性

通过调整XmlMapper的解析特性,让它在解析XML时只保留元素的文本内容,不把属性映射到JSON结构中:

XmlMapper xmlMapper = XmlMapper.builder()
    .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
    // 关键:禁用属性映射,直接保留元素文本作为节点值
    .defaultUseWrapper(false)
    .build();

2. 修正XML→JsonNode的转换流程

你之前绕了Map转JSON再转JsonNode的弯路,可以直接用配置好的XmlMapper把XML解析成JsonNode,效率更高且不会生成多余节点:

// 直接将XML解析为JsonNode,自动忽略所有XML属性
JsonNode jsonNode = xmlMapper.readTree(inputXMLString);

此时jsonNode里的Child1值就是"123456",不会包含Qualifier属性和空键的子节点。

3. 修正JsonNode→XML的转换流程

注意:ObjectMapper是处理JSON的工具,转XML必须用XmlMapper,否则会生成错误的XML结构:

// 用XmlMapper将处理后的JsonNode转回XML
String outputXMLString = xmlMapper.writeValueAsString(jsonNode);

完整可运行示例

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.databind.DeserializationFeature;

public class XmlJsonConverter {
    public static void main(String[] args) throws Exception {
        String inputXMLString = "<Roottag xmlns:ns5=\"http://abc.def.com/foo/bar/default.aspx\">\n" +
                "    <ns5:Parent>\n" +
                "        <ns5:Child1 Qualifier=\"XY\">123456</ns5:Child1>\n" +
                "        <ns5:Child2>160</ns5:Child2>\n" +
                "    </ns5:Parent>\n" +
                "</Roottag>";

        // 配置XmlMapper忽略XML属性
        XmlMapper xmlMapper = XmlMapper.builder()
                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
                .defaultUseWrapper(false)
                .build();

        // XML转JsonNode
        JsonNode jsonNode = xmlMapper.readTree(inputXMLString);
        // 这里可以对JsonNode进行自定义处理

        // JsonNode转XML
        String outputXMLString = xmlMapper.writeValueAsString(jsonNode);
        System.out.println(outputXMLString);
    }
}

运行后输出的XML完全符合你的期望:

<Parent>
   <Child1>123456</Child1>
    <Child2>160</Child2>
</Parent>

额外说明

  • 如果需要选择性忽略特定属性(而非全部),可以使用Jackson的@JsonIgnoreProperties注解,但因为你是用JsonNode而非实体类,全局配置忽略所有属性更适配当前场景。
  • 若需要保留XML命名空间,可在XmlMapper中添加命名空间相关配置,示例中因为最终输出不需要命名空间,所以当前配置足够。

内容的提问来源于stack exchange,提问作者CtrlAltElite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:15:34