2011-07-21 36 views
5

私はXMLを解析するので、Pythonでファイル.xsdを解析する必要があります。
私はlibxml2を使用しています。私はパスを見つけることができないことを私に伝えますPythonで.xsdを解析する

doc.xpathEval('//xs:complexType/xs:sequence/xs:element[@name="IeplcHeader"]'): 

にアクセスするとき

<xs:complexType name="ClassType"> 
<xs:sequence> 
    <xs:element name="IeplcHeader"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="device-number" type="xs:integer" fixed="1"/> 
      </xs:sequence> 
      <xs:attribute name="version" type="xs:integer" use="required" fixed="0"/> 
     </xs:complexType> 
    </xs:element> 


は、私は次のようになりXSDを解析する必要があります。

私はすべてのxsを削除するとしながら、:それは誰もが私は接頭辞を固定し、この問題を読んで得ることができる方法を知っているん

doc.xpathEval('//complexType/sequence/element[@name="IeplcHeader"]'): 

を働き、このように

<complexType name="ClassType"> 
    <sequence> 
    <element name="IeplcHeader"> 
     <complexType> 
      <sequence> 
       <element name="device-number" type="xs:integer" fixed="1"/> 
      </sequence> 
      <attribute name="version" type="xs:integer" use="required" fixed="0"/> 
     </complexType> 
    </element> 

に従うよう?今、私はxs:を削除してファイルを準備していますが、それは奇妙な解決策であり、私は本当に良いソリューションを見つけることができるように願っています。

(あなたはXSDファイルを扱う必要がある場合、 STE

答えて

8

を私はまだPY-DOM-のxpathをしようとしなかったし、私もXS :)

おかげで動作可能かどうかを知りません多分xmlファイルを検証するためにそれらを使用することをお勧めします。lxmlに渡すことをお勧めします。これはXMLSchemaファイルを良好にサポートしています。

コード例:

from lxml import etree 
from cStringIO import StringIO 

f = StringIO() 

f = StringIO('''\ 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<xsd:element name="a" type="AType"/> 
<xsd:complexType name="AType"> 
    <xsd:sequence> 
    <xsd:element name="b" type="xsd:string" /> 
    </xsd:sequence> 
</xsd:complexType> 
</xsd:schema> 
''')  

xmlschema_doc = etree.parse(f) 

xmlschema_doc.xpath('xsd:element', 
    namespaces={"xsd": "http://www.w3.org/2001/XMLSchema"}) 

結果で:

[<Element {http://www.w3.org/2001/XMLSchema}element at 0x9a17f2c>] 
+0

素敵なライブラリ。しかし、私はそれが私が必要としているかどうかはわかりません。 バリデーションにはとてもいいですが、この瞬間にはXSD内のいくつかのデータにアクセスする必要があります...奇妙に思えますが、xsdからいくつかのデータを読み込むスクリプトを書いています...)この時点で検証のために使用していません。:) – Stefano

+2

@Stefano: 'lxm'はバリデーションだけでなく' xpath'を使っても有効ではありません。テストを行うための完全な(切り捨てられた)xsdファイルを投稿すると役立ちます – neurino