我有以下代码来验证针对XSD的XML文档:
import lxml
import lxml.etree
xsd_definition = lxml.etree.XML('''\
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="test" type="testType"/>
<xs:complexType name="testType">
<xs:sequence>
<xs:element name="testElement" type="testElementType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="testElementType">
<xs:attribute name="intAttr" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:schema>
''')
xsd = lxml.etree.XMLSchema(xsd_definition)
parser = lxml.etree.XMLParser(schema=xsd)
test_xml = '''\
<test>
<testElement intAttr="10"/>
</test>
'''
lxml.etree.fromstring(test_xml, parser)
这适用于Python2.7,但它在Python3.5中不起作用。在Python3.5中,我得到以下异常:
lxml.etree.XMLSyntaxError: Element 'testElement', attribute 'intAttr': '' is not a valid value of the atomic type 'xs:positiveInteger'.
对于“testElement”元素的“intAttr”属性,解析器似乎没有读取“10”的值。有人知道我做错了吗?
答案 0 :(得分:0)
显然问题出在我使用的lxml版本上。我使用python 2.7的lxml版本是3.7,而我使用python 3.5的版本是3.8。这种差异的原因是因为我使用Debian的lxml包为python 2.7安装lxml,而我使用pip为python 3.5安装lxml。一旦我下降到3.7 for python 3.5,问题就消失了。