2009-05-14 10 views
6

Ich versuche, einen Namespace lxml ähnlich dieses Beispiel zu bestimmen (von here genommen):Python: Namespaces in lxml Hinzufügen

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

Ich bin nicht sicher, wie das Schema Instanz hinzufügen zu verwende und auch den Schema-Speicherort. Die documentation hatte ich 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 nicht sicher, wie es aber eine Instanz zu spezifizieren, und dann auch einen Ort angeben. Es scheint, als ob dies mit dem Schlüsselwort-arg nsmap in etree.Element getan werden kann, aber ich sehe nicht wie.

Antwort

8

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 ... Sie könnten natürlich 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') 

Was der nsmap Parameter: Ich glaube, es wird nur verwendet, um zu definieren, welche Präfixe bei der Serialisierung verwendet werden. In diesem Fall wird es nicht benötigt, da lxml weiß, dass das häufig verwendete Präfix für den betreffenden Namespace "xsi" ist. Wäre es nicht ein bekannter Namespace, würden Sie wahrscheinlich Präfixe wie "ns0", "ns1" usw. sehen, es sei denn, Sie haben angegeben, welches Präfix Sie bevorzugen. (Denken Sie daran, dass das Präfix keine Rolle spielt)

+0

Nur kleine Korrektur: Sollte noNamespaceSchemaLocation sein, no noNameSpaceSchemaLocation. –