2010-03-30 9 views
7

Estoy tratando de obtener una lista de elementos con un tipo específico de xsd con lxml 2.x y no puedo averiguar cómo atravesar el xsd para tipos específicos.Encontrar elementos basados ​​en el tipo xsd con lxml

Ejemplo de esquema:

<xsd:element name="ServerOwner" type="srvrs:string90" minOccurs="0"> 
<xsd:element name="HostName" type="srvrs:string35" minOccurs="0"> 

Ejemplo XML de datos:

<srvrs:ServerOwner>John Doe</srvrs:ServerOwner> 
<srvrs:HostName>box01.example.com</srvrs:HostName> 

La función ideal debería parecerse a:

elements = getElems(xml_doc, 'string90') 

    def getElems(xml_doc, xsd_type): 
     ** xpath or something to find the elements and build a dict 
     return elements 

Respuesta

5

Realmente la única lxml apoyo especial tiene para el esquema XML , como se ve here, es para decirle si algún documento es válido según algún esquema o no t. Algo más sofisticado tendrás que hacer tú mismo.

Esto debería ser un proceso relativamente simple de dos fases, pensaría - Obtener todos los xsd:element elementos en el esquema que coincide con el tipo que te importa, y mirar sus nombres:

def getElems(schemaDoc, xmlDoc, typeName): 
    names = schemaDoc.xpath("//xsd:element[@type = $n]/@name", 
          namespaces={"xsd": 
             "http://www.w3.org/2001/XMLSchema"}, 
          n=typeName) 

Luego, busque todos los elementos con cada nombre del documento.

elements = [] 
    for name in names: 
     namedElements = xmlDoc.xpath("//*[local-name() = $name]", name=name) 
     elements.extend(namedElements) 

Ahora tiene una lista de elementos con los nombres que coinciden con el tipo en el esquema.

return elements 

Tenga en cuenta que la expresión XPath para buscar el documento tiene que mirar cada elemento, por lo que si usted puede apretar que hasta solo se ve en la subsección del documento que se preocupan por que va a ir más rápido.

Cuestiones relacionadas