使用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:
- 先自定义反序列化类:
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; } }
- 在实体类上绑定反序列化器:
@Data @JsonDeserialize(using = DocumentDeserializer.class) public class Document { private String xmlns; // 其他属性正常定义 }
注意事项
- 若XML存在多个多级命名空间,可在对应层级的实体类上复用上述两种逻辑分别取值
- 建议使用2.13及以上版本的jackson-dataformat-xml,避免命名空间相关的已知bug
内容的提问来源于stack exchange,提问作者bob
相关产品推荐
相关产品推荐

