2017-06-13 22 views
2

私はXSDに対してXML文書を検証し、次のコードを持っている:これは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 = "10"をintAttr = ""に置き換えてエラーを再現できます。 exeptionは空文字列が有効な整数ではないことを示します。あなたの実際のコードの上にあるか、それとも単なる表象ですか? – Maarten

+0

本当ですか?今それは面白いスーパーです。それは実際のコードです。これはPython3.5とPython2.7の間で何か変わる問題(言語自体またはlxmlライブラリのいずれか)の問題ではなく、実際のP​​ython 3.5のインストールに問題があることを示していると思います。私はちょうどこのページのコードを貼り付けてコピーし、私のpython3.5インタプリタに何が起こるかを見てみると、同じエラーが出ます。私はDebianの "testing"のPython3.5パッケージを使用していますので、おそらくそれと関係があります。 –

+0

私の正確なpythonバージョンは3.5.2(と2.7.12)のubuntuで動作します。あなたのバージョンと比較する必要がある場合。 2.7では、外部依存としてlxmlをインストールする必要がありました。 – Maarten

答えて

0

明らかに問題は、私が使っていたlxmlのバージョンにありました。 Python 3.5で使用していたlxmlのバージョンは3.7でしたが、Python 3.5で使用していたバージョンは3.8でした。この不一致の理由は、Debianのlxmlパッケージを使用してPython 2.7用のlxmlをインストールしていて、pipを使用してpython 3.5用のlxmlをインストールしたためです。 Python 3.5の3.7に落としてしまえば、問題は解決されました。

関連する問題