2
我有以下的代码验证XML文档针对XSD:为什么这个工作在Python2.7而不是在Python3.5中?
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”的值。有人知道我做错了什么吗?
当我复制粘贴上面的代码在我的中间人,它在2.7和3.5下。我可以通过用intAttr =“”替换intAttr =“10”来重现错误。因此,如果使用空字符,则表示空字符串不是有效整数。高于你的实际代码还是只是一个表示? – Maarten
真的吗?现在这非常有趣。这是实际的代码。我认为这表明我的实际Python 3.5安装存在问题,而不是Python3.5和Python2.7之间(无论是在语言本身还是在lxml库中)都会发生变化的问题。我只是将代码直接粘贴到这个页面上,并粘贴到我的python3.5解释器中,以查看会发生什么,并且我得到了同样的错误。我正在使用Debian“测试”中的Python3.5软件包,所以也许这与它有关。 –
我的确切python版本是3.5.2(和2.7.12)在Ubuntu上运行。如果您需要与您的版本进行比较。在2.7我需要安装lxml作为外部依赖。 – Maarten