2010-03-30 6 views
7

J'essaie d'obtenir une liste d'éléments avec un type xsd spécifique avec lxml 2.x et je n'arrive pas à comprendre comment traverser xsd pour des types spécifiques.Rechercher des éléments basés sur le type xsd avec lxml

Exemple de schéma:

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

Exemple de données xml:

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

La fonction idéale ressemblerait à ceci:

elements = getElems(xml_doc, 'string90') 

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

Répondre

5

Vraiment le seul lxml support spécial a pour XML Schema , comme vu here, est de vous dire si un document est valide selon un schéma ou non t. Rien de plus sophistiqué que vous aurez à faire vous-même.

Cela devrait être un processus à deux phases relativement simple, je pense - obtenir tous les xsd:element éléments du schéma qui correspondent au type que vous aimez, et regardez leurs noms:

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

Ensuite, récupérez tous les éléments avec chaque nom du document.

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

Maintenant, vous avez une liste d'éléments avec les noms correspondant au type dans le schéma.

return elements 

Notez que l'expression XPath pour rechercher le document doit examiner tous les éléments, donc si vous pouvez serrer que jusqu'à seulement regarder dans le paragraphe du document que vous aimez ça va aller plus vite.

Questions connexes