2010-03-30 11 views
7

Sto cercando di ottenere un elenco di elementi con un tipo xsd specifico con lxml 2.x e non riesco a capire come attraversare xsd per tipi specifici.Trova elementi basati su xsd type con lxml

Esempio di schema:

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

Esempio di dati xml:

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

La funzione ideale sarebbe simile:

elements = getElems(xml_doc, 'string90') 

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

risposta

5

Davvero l'unico lxml supporto speciale ha per XML Schema , come visto here, è per dirti se qualche documento è valido secondo uno schema o no t. Qualcosa di più sofisticato devi fare da solo.

Questo dovrebbe essere un processo relativamente semplice a due fasi, mi piacerebbe pensare - Ottenere tutti i xsd:element elementi dello schema che corrisponde al tipo che ti interessano, e guardare i loro nomi:

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

Quindi, recupera tutti gli elementi con ciascun nome dal documento.

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

Ora si dispone di un elenco di elementi con i nomi che corrispondono al tipo nello schema.

return elements 

Si noti che l'espressione XPath per la ricerca del documento deve esaminare ogni elemento, quindi se si può stringere che fino a guardare solo nel comma del documento che si cura su di esso andrà più veloce.

Problemi correlati