Java解析xsi:nil=”true”需手动处理:JAXB须用@XmlElement(nillable=true)并声明xsi命名空间;DOM需检查xsi:nil属性;Jackson XML推荐@JacksonXmlProperty(isNillable=true),三者均需确保命名空间支持。
Java解析带有 xsi:nil="true" 的XML节点时,关键在于正确识别“空值”语义——它不是元素内容为空字符串,而是表示该元素**明确被设为 null**(即“存在但无值”)。默认的DOM、SAX或JAXB解析器不会自动将其映射为 null,需手动处理或配置支持。
使用JAXB时启用 nil 处理
JAXB 默认忽略 xsi:nil="true",需配合 @XmlElement(nillable = true) 注解,并确保绑定上下文能识别 xsi 命名空间。
- 在Java Bean字段上添加
@XmlElement(nillable = true),例如:@XmlElement(nillable = true) private String description; - 确保XML文档声明了 xsi 命名空间:
... - 反序列化后,若对应节点含
xsi:nil="true",JAXB 会将该字段设为null;若节点缺失或为空字符串,则取决于其他配置(如@XmlSchemaType或自定义适配器)。
使用DOM解析时手动检查 xsi:nil
DOM不自动处理 nil 语义,需显式读取属性并判断:
- 获取元素节点后,检查是否存在命名空间前缀为
xsi的nil属性:String nilAttr = element.getAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "nil"); - 若
"true".equals(nilAttr),则逻辑上应视作 null;此时即使element.getTextContent()返回空字符串或空白,也不代表业务上的空值。 - 注意:需确保解析器启用了命名空间支持(
factory.setNamespaceAware(true);)。
使用Jackson XML(jackson-dataformat-xml)
Jackson XML 支持通过 @JsonInclude(Include.NON_NULL) 和 @JacksonXmlProperty(isAttribute = true, localName = "nil") 配合 xsi:nil,但更推荐用 @JacksonXmlProperty(isNillable = true):