2017-06-13 84 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,问题就消失了。

相关问题