我编写了一个python脚本,允许在xsd模式文件之后将csv文件解析为xml文件。根据xsd模式使用验证输出xml文件 lxml.etree
的 XMLSchema
方法。
我目前正在通过使用伪数字(-999)替换缺少的值来处理这些值,如本问题中所述,但最近向我提供了一个新的xsd文件,该文件允许nillable元素:
<xs:element name="ProfileValue" type="xs:double" nillable="true"/>
1.在这篇so帖子之后,我尝试使用 xml_data.append('<ProfileValue xsi:nil="true"/>')
将“缺少”值传递到xml文件,但这会导致以下错误:
未定义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”的有效值。
我也试过了 xml_data.append('<ProfileValue nil="true"> </ProfileValue>')
在这篇文章之后,但也出现了一个错误:
元素“profilevalue”:“”不是原子类型“xs:double”的有效值。
我做错了什么?甚至可以将双类型值设置为nillable吗?
1条答案
按热度按时间x8goxv8g1#
感谢您对问题的描述,感谢您解释了您已经尝试过的所有内容。
我想你有两个问题
您正在使用名称空间前缀“xsi”,但未声明该名称空间。这就像在c/java中使用变量而不首先声明它一样。您需要在输出xml中包含xmlns属性(或“名称空间声明”)。这样地:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
. 它可以包含在使用xsi:nil的每个标记上,但它通常在根标记上声明一次,从而避免了xsi名称空间的多个声明。您正在使用字符串操作构建输出xml。这是可行的,但前提是你运气好。由于您显然可以访问lxml库,因此我强烈建议您允许lxml为您执行所有xml语法(请参阅lxml名称空间)。如果继续当前路径,则需要处理保留xml字符、非法xml字符等的xml转义规则。