如何在XML中处理nillable值 解决xsi:nil属性命名空间报错问题
问题解答
错误原因梳理
- 命名空间使用错误
xsi:nil是XML Schema实例标准定义的空值标识属性,必须绑定http://www.w3.org/2001/XMLSchema-instance命名空间才能使用。不存在xs和xsi前缀可互换的说法:xs是XML Schema定义文件的专属前缀,用于编写XSD规则;xsi是XML实例文件的专属前缀,用于标注校验相关属性。你第一次尝试的<ProfileValue xsi:nil="true"/>语法本身正确,仅因为没有在XML根节点声明xsi前缀对应的命名空间才触发报错。 - nil属性使用规则不符合要求
设置了xsi:nil="true"的元素必须是完全空的标签,不能包含任何内容(包括空格、换行等)。你后续省略前缀、添加空格的写法,都不符合标准规范,校验器会将元素的内容(空字符串、空格)当做xs:double类型的值校验,自然会触发类型不合法的错误。 - 关于double类型的nillable支持
只要XSD中明确声明了nillable="true",包括xs:double在内的所有内置基础类型都支持设置空值,你遇到的报错和字段类型没有关联。
正确实现方案
方案1:使用lxml节点操作(推荐,避免手动拼接的语法错误)
from lxml import etree # 1. 创建根节点时声明xsi命名空间 root = etree.Element( "你的根节点名称", nsmap={ "xsi": "http://www.w3.org/2001/XMLSchema-instance" # 其他你需要的命名空间可以继续加在这里 } ) # 2. 遇到缺失值时生成带xsi:nil的节点 profile_val = etree.SubElement(root, "ProfileValue") profile_val.set("{http://www.w3.org/2001/XMLSchema-instance}nil", "true") # 3. 校验时直接用etree的XMLSchema方法即可正常通过 schema = etree.XMLSchema(etree.parse("你的xsd文件路径")) schema.assertValid(root)
方案2:手动拼接XML字符串
首先在根标签中加入xsi命名空间声明:
<你的根节点名称 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
遇到缺失值时直接拼接空标签即可:
xml_data.append('<ProfileValue xsi:nil="true"/>')
内容的提问来源于stack exchange,提问作者Sheldon
相关产品推荐
相关产品推荐

