如何处理xml中的nillable值



我编写了一个Python脚本,允许在xsd模式文件之后将csv文件解析为xml。使用lxml.etreeXMLSchema方法根据xsd模式验证输出xml文件。

我目前正在处理缺失的值,将它们替换为一个伪数字(-999(,如本问题中所述,但我最近收到了一个新的xsd文件,该文件允许nillable元素:

<xs:element name="ProfileValue" type="xs:double" nillable="true"/>

1。在这篇SO帖子之后,我尝试使用xml_data.append('<ProfileValue xsi:nil="true"/>')来传递";缺少";值,但这会导致以下错误:

ProfileValue上nil的命名空间前缀xsi未定义

2.在了解到xsi和xs前缀是可互换的之后,我也尝试了xml_data.append('<ProfileValue xs:nil="true"/>'),但毫无疑问,这也返回了XMLSyntaxError

ProfileValue上nil的命名空间前缀xs未定义

3。我尝试省略前缀(xml_data.append('<ProfileValue nil="true"/>')(,但这导致了以下错误:

元素"ProfileValue":"不是原子类型的有效值"xs:double"。

4.我也在这个SO帖子后尝试了xml_data.append('<ProfileValue nil="true"> </ProfileValue>'),但也得到了一个错误:

元素"ProfileValue":"不是原子类型的有效值"xs:double"。

我做错了什么?是否可以将double类型的值设置为nillable?

感谢您对问题的描述,并感谢您解释了您已经尝试过的所有内容。

我想你有两个问题

  1. 您使用了命名空间前缀"xsi",但没有声明该命名空间。这就像在C/Java中使用一个变量而不首先声明它一样。您需要在输出XML中包含xmlns属性(或"命名空间声明"(。像这样:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"。它可以包含在每个使用xsi:nil的标记上,但它通常在根标记上声明一次,从而避免了xsi命名空间的多次声明。

  2. 您正在使用字符串操作构建输出XML。这是可行的,但前提是你运气好。由于您显然可以访问lxml库,我强烈建议您允许lxml为您执行所有XML语法(请参阅lxml名称空间(。如果您继续使用当前路径,您将需要处理保留XML字符、非法XML字符等的XML转义规则。

最新更新