2011-07-21 14 views
5

Potrzebuję parsować plik .xsd w Pythonie, ponieważ chciałbym parsować XML.
Używam libxml2.
muszę analizować xsd, które wyglądają następująco:
parsowanie .xsd w pythonie

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

kiedy dostęp z

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

mi mówi, że nie może odnaleźć ścieżki.

natomiast jeśli usunąć wszystkie xs: jak postępować

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

w ten sposób to działa

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

Czy ktoś wie jak mogę dostać czytać tego problemu ustalające prefiks? righ teraz przygotowuję plik usuwający xs: ale jest to okropne rozwiązanie i naprawdę mam nadzieję, że uda mi się znaleźć lepsze rozwiązanie.

(nie próbowałem z PY-DOM-XPath jeszcze i nie wiem, czy może pracować nawet z xs :)

podziękowania ste

Odpowiedz

8

Jeśli masz do czynienia z plików XSD , być może również za ich pomocą do sprawdzania poprawności plików xml Proponuję przekazać do lxml, która ma dobre wsparcie dla plików XMLSchema.

przykładowy 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"}) 

skutkuje:

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

miłe biblioteka. ale nie jestem pewien, czy robi to, czego potrzebuję. Jest bardzo miły dla sprawdzania poprawności ... ale w tym momencie Po prostu muszę uzyskać dostęp do niektórych danych wewnątrz XSD ... brzmi to dziwnie, ale piszę skrypt, który ma CZYTAĆ niektóre dane z xsd ...;) I nie używam go do sprawdzania w tym momencie .. :) – Stefano

+2

@Stefano: 'lxm' nie jest dobry tylko do sprawdzania poprawności, ale także do używania' xpath'. Pomocne byłoby wysłanie kompletnego (usuniętego) pliku xsd, aby wykonać testy – neurino