【问题标题】:Why does this work in Python2.7 but not in Python3.5?为什么这在 Python2.7 中有效,但在 Python3.5 中无效?
【发布时间】:2017-06-13 14:43:42
【问题描述】:

我有以下代码可以根据 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”值。有谁知道我做错了什么?

【问题讨论】:

  • 当我在我的解释器中复制粘贴上面的代码时,它在 2.7 和 3.5 下都有效。我可以通过将 intAttr="10" 替换为 intAttr="" 来重现该错误。所以用空字符串作为例外也表明空字符串不是有效的整数。是在你的实际代码之上还是只是一个表示?
  • 真的吗?现在这非常有趣。这是实际的代码。我认为这表明我的实际 Python 3.5 安装存在问题,而不是 Python3.5 和 Python2.7(语言本身或 lxml 库)之间发生变化的问题。我只是将代码直接从该页面复制粘贴到我的 python3.5 解释器中,只是为了看看会发生什么,我得到了同样的错误。我正在使用来自 Debian“测试”的 Python3.5 包,所以可能与它有关。
  • 我的确切 python 版本是在 ubuntu 上运行的 3.5.2 (and2.7.12 )。如果您需要与您的版本进行比较。在 2.7 上,我需要安装 lxml 作为外部依赖项。
  • 我解决了。我使用 pip3 安装 lxml。然后我卸载了它(使用“pip3 卸载”),然后安装了 Debian 的 python3-lxml 包,现在它可以工作了。 Debian 的 python3-lxml 软件包是 3.7 版本,而使用 pip3 安装的 lxml 是 3.8。您的评论为我指明了正确的方向,否则我将永远朝着这个方向前进。谢谢!
  • 没问题。也许你应该继续回答你自己的问题。我不是故意在评论中这样做的。 :)

标签: python python-2.7 python-3.x lxml


【解决方案1】:

显然问题出在我使用的 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,问题就消失了。

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多