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

使用Jackson-dataformat-xml如何获取xmlns属性值?

解决方案

xmlns是XML命名空间定义,Jackson默认不会将其识别为普通属性处理,你可以通过两种方式获取该值:

方式一:指定命名空间属性的localName和namespace

Jackson处理命名空间属性时需要显式声明属性的命名空间和本地名,修改实体类注解如下:

@Data
public class Document {
    @JacksonXmlProperty(isAttribute = true, localName = "xmlns", namespace = "http://www.w3.org/2000/xmlns/")
    private String xmlns;
}

xmlns属性本身属于W3C默认的XML命名空间http://www.w3.org/2000/xmlns/,显式指定后即可正常读取属性值。

方式二:自定义反序列化器处理根节点命名空间

如果方式一不生效(部分旧版本Jackson存在兼容问题),可以自定义反序列化器直接读取根节点的命名空间URI:

  1. 先自定义反序列化类:
public class DocumentDeserializer extends StdDeserializer<Document> {
    public DocumentDeserializer() {
        super(Document.class);
    }

    @Override
    public Document deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        // 转换为XML解析器
        FromXmlParser xmlParser = (FromXmlParser) p;
        // 获取当前节点的命名空间URI
        String namespaceURI = xmlParser.getStaxReader().getNamespaceURI();
        // 正常反序列化其他属性
        Document document = ctxt.readValue(p, Document.class);
        // 手动赋值xmlns
        document.setXmlns(namespaceURI);
        return document;
    }
}
  1. 在实体类上绑定反序列化器:
@Data
@JsonDeserialize(using = DocumentDeserializer.class)
public class Document {
    private String xmlns;
    // 其他属性正常定义
}

注意事项

  • 若XML存在多个多级命名空间,可在对应层级的实体类上复用上述两种逻辑分别取值
  • 建议使用2.13及以上版本的jackson-dataformat-xml,避免命名空间相关的已知bug

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:54:02