Seite 1 von 1

Verständnisfrage zu lxml und namepace-Vergabe bei Attributen

Verfasst: Dienstag 28. April 2009, 14:23
von Marky
Hallo zusammen,

ich hätte da mal ein Frage zur lxml-lib und dem Binden des space-Attributes an den xml-namespace.

Angenommen ich hätte ein XML-Fragement, wie nachfolgend beschrieben mit einem space-Attribut.

Code: Alles auswählen

 >>   xml = "<root xml:space=\"preserve\"/>"
 >>   root = etree.fromstring(xml)
 >>   print etree.tostring(root)
 <root xml:space="preserve"/>
Funktioniert wunderbar bei der Ausgabe und der Namespace bleibt erhalten.
Nun kann es ja vorkommnen, dass ich so ein Attribut mit entsprechendem Namespace selbst an ein neues Element setzen will, doch wie mache ich das ?
Weiß da jemand Rat?

Code: Alles auswählen

>> root = etree.Element("root", space="preserve")
>> print etree.tostring(root)
<root space="preserve"/>
Wie kann ich für das space-Attribut den xml-namespace setzen? Die Ausgabe soll genauso aussehen, wie im ersten Fall.

Verfasst: Dienstag 28. April 2009, 14:30
von Dill
du setzt den ns in {} vor den tag-name.

http://codespeak.net/lxml/tutorial.html#namespaces

Verfasst: Dienstag 28. April 2009, 14:34
von Leonidas

Code: Alles auswählen

ET.tostring(ET.Element("root", {'xml:space': 'preserve'}))

Verfasst: Dienstag 28. April 2009, 14:40
von Marky
hm ... da passiert folgendes:

Code: Alles auswählen

    print etree.tostring(etree.Element("root", {'xml:space': 'preserve'}))
  File "lxml.etree.pyx", line 2352, in lxml.etree.Element (src/lxml/lxml.etree.c:49394)
  File "apihelpers.pxi", line 143, in lxml.etree._makeElement (src/lxml/lxml.etree.c:11072)
  File "apihelpers.pxi", line 131, in lxml.etree._makeElement (src/lxml/lxml.etree.c:10942)
  File "apihelpers.pxi", line 277, in lxml.etree._initNodeAttributes (src/lxml/lxml.etree.c:12501)
  File "apihelpers.pxi", line 1380, in lxml.etree._attributeValidOrRaise (src/lxml/lxml.etree.c:22491)
ValueError: Invalid attribute name u'xml:space'
Nachtrag: Ist die aktuelle Version 2.2

Verfasst: Dienstag 28. April 2009, 14:42
von Leonidas
Ups, sorry, ich habe da aus versehen ElementTree genutzt, da funktioniert das so. :oops:

Verfasst: Dienstag 28. April 2009, 14:47
von Marky
Noch ein Nachtrag für Dill: Hier geht es nicht um den Namespace an Elementen generell, sondern um den Namespace für die beiden Attribute space und lang http://www.w3.org/XML/1998/namespace

Verfasst: Dienstag 28. April 2009, 14:55
von Marky
Hallo Leute,

so gehts mit lxml.etree:

Code: Alles auswählen

root = etree.Element("root", attrib={'{http://www.w3.org/XML/1998/namespace}space': 'preserve'})
    print etree.tostring(root)
Hab' eben Nachricht von der Mailingliste gekriegt ... :wink:
Ist das hier dann auch bekannt...

Trotzdem Danke für die schnelle Reaktionszeit!

Verfasst: Dienstag 28. April 2009, 14:55
von Dill
steht das da nicht?
naja für attribute gehts aber genauso...
in {} vor att-name.

EDIT:
ok, hast es ja jetzt.
aber den transfer hättest du auch selbst leisten könne, dass wenn du den ns vor dem @ willst ihn nicht vor den ele-tag setzt...

Verfasst: Dienstag 28. April 2009, 15:01
von Marky
jaja, danke für den Hinweis... :lol:
wollte eben gerade zugeben, dass ich den Tansfer da nicht geschafft habe ... :K