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,
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

an xpath hab ich nicht gedacht ...
Verfasst: Montag 8. März 2010, 19:39
von jens
Dav1d hat geschrieben:
Edit:
Es gibt noch mehr schöne Sachen,
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
Danke an alle.