2011-07-21 19 views
5

Bir XML ayrıştırmak için Python'daki bir .xsd dosyasını ayrıştırmam gerekiyor.
libxml2 kullanıyorum. i yolu bulamıyor söylüyorpython'da .xsd ayrıştırma

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

ile eriştiklerinde

<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> 

:
Ben aşağıdaki gibi bakmak bir xsd ayrıştırmak gerekiyor.

i tüm xs kaldırırsanız ise: gibi

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

çalışır bu şekilde

<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> 

izleyin kimse ben bir önek sabitleme bu sorunun okumak alabilirsiniz bilen var mı? righ şimdi xs kaldırarak dosyayı hazırlıyorum: ama bu bir asabi çözüm ve gerçekten daha iyi bir çözüm bulabilmek için umuyoruz.

(eğer xsd dosyaları ile uğraşmak zorunda ise ste

cevap

8

Henüz py-dom-xpath ile deneyin vermedi ve ben bile xs :)

sayesinde çalışabilir bilmiyorum belki de xml dosyalarını doğrulamak için bunları kullanıyorum XMLSchema dosyaları için iyi bir desteği olan lxml'a geçmenizi öneririm.

örnek kod:

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"}) 

Sonuçlar:

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

güzel kütüphanesi. ama ihtiyacım olanı yaptığından emin değilim. Doğrulama için çok iyi ... ama şu anda XSD içindeki bazı verilere erişmem gerekiyor ... garip geliyor ama xsd'den bazı verileri OKMAK olan bir script yazıyorum ...;) I Bu noktada doğrulama için kullanmıyorum .. :) – Stefano

+2

@Stefano: 'lxm' yalnızca doğrulama için değil, aynı zamanda' xpath' kullanarak da iyi değildir. Üzerinde test yapmak için tam (soyulmuş) bir xsd dosyası göndermek yardımcı olur – neurino