Seite 1 von 1

ElementTree: Namen heraus bekommen...

Verfasst: Montag 8. März 2010, 15:01
von jens

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?

Verfasst: Montag 8. März 2010, 16:08
von Dav1d
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

Verfasst: Montag 8. März 2010, 17:49
von Hyperion
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.

Verfasst: Montag 8. März 2010, 17:52
von Dav1d
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

Verfasst: Montag 8. März 2010, 18:10
von 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 …

Verfasst: Montag 8. März 2010, 18:29
von Hyperion
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'

Verfasst: Montag 8. März 2010, 19:13
von Dav1d
:o an xpath hab ich nicht gedacht ...

Verfasst: Montag 8. März 2010, 19:39
von jens
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?

Verfasst: Montag 8. März 2010, 19:48
von Dav1d
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

Verfasst: Montag 8. März 2010, 20:08
von jens
Ja, da hätte ich selbst drauf kommen können :oops:

Danke an alle.