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