8 Stimmen

Finden Sie Elemente basierend auf dem xsd-Typ mit lxml

Ich versuche, eine Liste von Elementen mit einem bestimmten xsd-Typ mit lxml 2.x zu erhalten und kann nicht herausfinden, wie ich das xsd für spezifische Typen durchlaufen soll.

Beispiel für Schema:

Beispiel XML-Daten:

John Doe
box01.example.com

Die ideale Funktion würde so aussehen:

    elements = getElems(xml_doc, 'string90')

    def getElems(xml_doc, xsd_type):
      ** xpath oder etwas, um die Elemente zu finden und ein dict aufzubauen
      return elements

5voto

Allen Punkte 4919

Das einzige spezielle Support, den lxml für XML Schema hat, wie hier gesehen wird, ist Ihnen mitzuteilen, ob ein Dokument gemäß einem Schema gültig ist oder nicht. Alles Weitere müssen Sie selbst erledigen.

Dies sollte ein relativ einfacher zweiphasiger Prozess sein, denke ich - Holen Sie alle xsd:element-Elemente im Schema, die dem von Ihnen gesuchten Typ entsprechen, und betrachten Sie deren Namen:

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

Holen Sie dann alle Elemente mit jedem dieser Namen aus dem Dokument.

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

Jetzt haben Sie eine Liste von Elementen mit den Namen, die dem im Schema übereinstimmenden Typ entsprechen.

    return elements

Beachten Sie, dass der xpath-Ausdruck zur Suche im Dokument jedes Element betrachten muss, daher wird es schneller gehen, wenn Sie dies auf den Unterabschnitt des Dokuments einschränken können, der Sie interessiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X