Frage

Ich versuche, einen Namespace angeben mit lxml ähnlich zu diesem Beispiel (aus hier ):

<TreeInventory xsi:noNamespaceSchemaLocation="Trees.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</TreeInventory>

Ich bin mir nicht sicher, wie das Schema Instanz hinzuzufügen, um das Schema Standort zu verwenden und auch. Die Dokumentation mich bekam begonnen, von etwas zu tun, wie:

>>> NS = 'http://www.w3.org/2001/XMLSchema-instance'
>>> TREE = '{%s}' % NS
>>> NSMAP = {None: NS}
>>> tree = etree.Element(TREE + 'TreeInventory', nsmap=NSMAP)
>>> etree.tostring(tree, pretty_print=True)
'<TreeInventory xmlns="http://www.w3.org/2001/XMLSchema-instance"/>\n'

Ich bin mir nicht sicher, wie es zwar eine Instanz zu spezifizieren, und dann auch einen Ort angeben. Es scheint, wie dies mit dem nsmap Schlüsselwort-Arg- in etree.Element getan werden, aber ich sehe nicht, wie.

War es hilfreich?

Lösung

In einigen mehreren Schritten für Klarheit:

>>> NS = 'http://www.w3.org/2001/XMLSchema-instance'

Soweit ich sehen kann, ist es das Attribut noNameSpaceSchemaLocation, die Sie möchten einen Namespace, nicht das TreeInventory Element. Also:

>>> location_attribute = '{%s}noNameSpaceSchemaLocation' % NS
>>> elem = etree.Element('TreeInventory', attrib={location_attribute: 'Trees.xsd'})
>>> etree.tostring(elem, pretty_print=True)
'<TreeInventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Trees.xsd"/>\n'

Das sieht aus wie, was Sie wollten ... Natürlich könnten Sie schaffen auch das Element zuerst, ohne Attribute, und stellen Sie dann das Attribut, wie folgt aus:

>>> elem = etree.Element('TreeInventory')
>>> elem.set(location_attribute, 'Trees.xsd')

Wie für die nsmap Parameter: Ich glaube, dass es nur zu definieren, verwendet wird, die auf der Serialisierung verwenden Präfixe. In diesem Fall ist es nicht erforderlich, weil lxml den häufig verwendeten Präfix für den Namespace in Frage kennt, ist „xsi“. Wenn es nicht einige bekannte Namensraum waren, würden Sie wahrscheinlich Präfixe wie „ns0“ sehen „NS1“ etc ..., es sei denn, Sie festgelegt, die als Präfix bevorzugt. (Zur Erinnerung: das Präfix nicht an der Materie soll)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top