ElementTree: Namen heraus bekommen...

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Code: Alles auswählen

from xml.etree import cElementTree as ET

xml_data = """<?xml version="1.0" encoding="utf-8" ?>
<D:lockinfo xmlns:D="DAV:">
  <D:locktype><D:write/></D:locktype>
  <D:lockscope><D:exclusive/></D:lockscope>
</D:lockinfo>"""

e = ET.XML(xml_data)
locktype_element = e.find(".//{DAV:}locktype")
locktype = locktype_element.getchildren()[0]
print locktype
Ausgabe:
<Element '{DAV:}write' at 0x7ffa3ded94b0>
Ich würde gern den String "write" erhalten. Wie geht das?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Vielleicht so?:

Code: Alles auswählen

>>> from xml.etree import cElementTree as ET
>>> xml_data = """<?xml version="1.0" encoding="utf-8" ?>
... <D:lockinfo xmlns:D="DAV:">
...   <D:locktype><D:write/></D:locktype>
...   <D:lockscope><D:exclusive/></D:lockscope>
... </D:lockinfo>"""
>>> e = ET.XML(xml_data)
>>> locktype_element = e.find(".//{DAV:}locktype")
>>> locktype = locktype_element.getchildren()[0]
>>> print locktype
<Element '{DAV:}write' at 01A70FB0>
>>> print locktype.tag
{DAV:}write
Edit:
Es gibt noch mehr schöne Sachen,

Code: Alles auswählen

.tail
.attrib
.text
.get() # siehe Dictionaries
the more they change the more they stay the same
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

So wie ich das sehe gibts in der ElementTree Lib keine Funktion zum Entfernen von Namespaces aus dem Tag-Namen.

Ich würde es wohl so angehen:

Code: Alles auswählen

In [31]: node.tag
Out[31]: '{DAV:}write'

In [32]: node.tag.split("}")
Out[32]: ['{DAV:', 'write']

In [33]: node.tag.split("}")[1]
Out[33]: 'write'
Evtl. bietet lxml da mehr? Ich nutze die quasi immer, wenn ich was mit XML machen möchte.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Hyperion hat geschrieben:Evtl. bietet lxml da mehr? Ich nutze die quasi immer, wenn ich was mit XML machen möchte.
AFAIK bietet lxml dazu nicht mehr
the more they change the more they stay the same
lunar

lxml kann XPath, und XPath wiederum kann ziemlich viel, und hat iirc auch diverse Funktionen, um Metadaten eines Knotens (e.g. Name, Namensraum, usw.) abzufragen …
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

lxml rockt :-)

Code: Alles auswählen

In [78]: from lxml import etree

In [79]: xml_data = """<?xml version="1.0" encoding="utf-8" ?>
   ....: <D:lockinfo xmlns:D="DAV:">
   ....:   <D:locktype><D:write/></D:locktype>
   ....:   <D:lockscope><D:exclusive/></D:lockscope>
   ....: </D:lockinfo>"""

In [80]: root = etree.fromstring(xml_data)

In [81]: root.xpath("local-name(//D:write)", namespaces={"D":"DAV:"})
Out[81]: 'write'
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

:o an xpath hab ich nicht gedacht ...
the more they change the more they stay the same
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dav1d hat geschrieben:

Code: Alles auswählen

>>> print locktype.tag
{DAV:}write
Edit:
Es gibt noch mehr schöne Sachen,

Code: Alles auswählen

.tail
.attrib
.text
.get() # siehe Dictionaries
Das ist ja interessant, denn:

Code: Alles auswählen

...
locktype = locktype_element.getchildren()[0]
print locktype

for i in dir(locktype):
    print i
<Element '{DAV:}write' at 0xb7760b18>
__copy__
__deepcopy__
__reduce__
append
clear
find
findall
findtext
get
getchildren
getiterator
insert
items
keys
makeelement
remove
set
wie kann das?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Liegt wahrscheinlich daran, dass es der cElementTree ist

Code: Alles auswählen

>>> from xml.etree import ElementTree as ET
>>> xml_data = """<?xml version="1.0" encoding="utf-8" ?>
... <D:lockinfo xmlns:D="DAV:">
...   <D:locktype><D:write/></D:locktype>
...   <D:lockscope><D:exclusive/></D:lockscope>
... </D:lockinfo>"""
>>> e = ET.XML(xml_data)
>>> locktype_element = e.find(".//{DAV:}locktype")
>>> l = locktype_element.getchildren()[0]
>>> dir(l)
['__delitem__', '__delslice__', '__doc__', '__getitem__', '__getslice__', '__init__', '__len__', '__module__',
 '__repr__', '__setitem__', '__setslice__', '_children', 'append', 'attrib', 'clear', 'find', 'findall', 'findtext',
 'get', 'getchildren', 'getiterator', 'insert', 'items', 'keys', 'makeelement', 'remove', 'set', 'tag', 'tail', 'text']
>>> 
Edit: Code dem Forum angepasst
the more they change the more they stay the same
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ja, da hätte ich selbst drauf kommen können :oops:

Danke an alle.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten