2017-06-13 95 views
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」的值。有人知道我做錯了什麼嗎?

+0

當我複製粘貼上面的代碼在我的中間人,它在2.7和3.5下。我可以通過用intAttr =「」替換intAttr =「10」來重現錯誤。因此,如果使用空字符,則表示空字符串不是有效整數。高於你的實際代碼還是隻是一個表示? – Maarten

+0

真的嗎?現在這非常有趣。這是實際的代碼。我認爲這表明我的實際Python 3.5安裝存在問題,而不是Python3.5和Python2.7之間(無論是在語言本身還是在lxml庫中)都會發生變化的問題。我只是將代碼直接粘貼到這個頁面上,並粘貼到我的python3.5解釋器中,以查看會發生什麼,並且我得到了同樣的錯誤。我正在使用Debian「測試」中的Python3.5軟件包,所以也許這與它有關。 –

+0

我的確切python版本是3.5.2(和2.7.12)在Ubuntu上運行。如果您需要與您的版本進行比較。在2.7我需要安裝lxml作爲外部依賴。 – Maarten

回答

0

顯然問題出在我使用的lxml版本。我使用python 2.7的lxml版本是3.7,而我用python 3.5的版本是3.8。造成這種差異的原因是因爲我使用Debian的lxml包爲python 2.7安裝lxml,而我使用pip爲python 3.5安裝lxml。一旦我爲python 3.5下降到3.7,問題就消失了。

相關問題