Verständnisfrage zu lxml und namepace-Vergabe bei Attributen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Marky
User
Beiträge: 24
Registriert: Donnerstag 22. Januar 2009, 08:12

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.
Gruß
Marky
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

du setzt den ns in {} vor den tag-name.

http://codespeak.net/lxml/tutorial.html#namespaces
http://www.kinderpornos.info
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Code: Alles auswählen

ET.tostring(ET.Element("root", {'xml:space': 'preserve'}))
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Marky
User
Beiträge: 24
Registriert: Donnerstag 22. Januar 2009, 08:12

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
Gruß
Marky
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ups, sorry, ich habe da aus versehen ElementTree genutzt, da funktioniert das so. :oops:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Marky
User
Beiträge: 24
Registriert: Donnerstag 22. Januar 2009, 08:12

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
Gruß
Marky
Marky
User
Beiträge: 24
Registriert: Donnerstag 22. Januar 2009, 08:12

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!
Gruß
Marky
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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...
http://www.kinderpornos.info
Marky
User
Beiträge: 24
Registriert: Donnerstag 22. Januar 2009, 08:12

jaja, danke für den Hinweis... :lol:
wollte eben gerade zugeben, dass ich den Tansfer da nicht geschafft habe ... :K
Gruß
Marky
Antworten