2011-07-21 46 views
5

Necesito analizar un archivo .xsd en Python como analizaría un XML.
Estoy usando libxml2.
que tienen que analizar un xsd que se ven de la siguiente manera:
analizando .xsd en python

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

cuando accedo con

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

me dice que no puede encontrar la ruta.

mientras que si puedo eliminar todos los xs: como siguen

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

de esta manera funciona

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

¿Alguien sabe cómo puedo obtener lectura de este problema fijando un prefijo? Ahora estoy preparando el archivo eliminando el xs: pero es una solución viable y realmente espero poder encontrar una mejor solución.

(No probé con py-dom-XPath todavía y no sé si puede trabajar incluso con las x :)

gracias, ste

Respuesta

8

Si usted tiene que tratar con archivos XSD , tal vez también utilizándolos para validar archivos xml, sugiero que pases al lxml que tiene un buen soporte para archivos XMLSchema.

código de ejemplo:

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

resultados en:

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

buena biblioteca. pero no estoy seguro de que haga lo que necesito. Es muy bueno para la validación ... pero en este momento solo necesito acceder a algunos datos dentro del XSD ... suena extraño pero estoy escribiendo un script que tiene que LEER algunos datos de un xsd ...;) I ma no lo usa para validación en este punto ... :) – Stefano

+2

@Stefano: 'lxm' no solo sirve para validar sino también para' xpath'. Publicar un archivo xsd completo (desmantelado) para realizar pruebas ayudaría – neurino