Ich versuche, Inhalt in einer OpenOffice ODS-Tabelle zu analysieren. Das ods-Format ist im Wesentlichen nur eine Zip-Datei mit einer Anzahl von Dokumenten. Der Inhalt der Tabelle wird in 'content.xml' gespeichert.Wie verwende ich XML-Namespaces mit find/findall in Lxml?
import zipfile
from lxml import etree
zf = zipfile.ZipFile('spreadsheet.ods')
root = etree.parse(zf.open('content.xml'))
Der Inhalt der Tabelle ist in einer Zelle:
table = root.find('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table')
Wir haben auch gerade für die Zeilen gehen kann:
rows = root.findall('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table-row')
Die einzelnen Elemente kennen die Namespaces:
>>> table.nsmap['table']
'urn:oasis:names:tc:opendocument:xmlns:table:1.0'
Wie? Ich benutze die Namespaces direkt in find/findall?
Die offensichtliche Lösung funktioniert nicht.
Der Versuch, die Zeilen aus der Tabelle zu erhalten:
>>> root.findall('.//table:table')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "lxml.etree.pyx", line 1792, in lxml.etree._ElementTree.findall (src/lxml/lxml.etree.c:41770)
File "lxml.etree.pyx", line 1297, in lxml.etree._Element.findall (src/lxml/lxml.etree.c:37027)
File "/usr/lib/python2.6/dist-packages/lxml/_elementpath.py", line 225, in findall
return list(iterfind(elem, path))
File "/usr/lib/python2.6/dist-packages/lxml/_elementpath.py", line 200, in iterfind
selector = _build_path_iterator(path)
File "/usr/lib/python2.6/dist-packages/lxml/_elementpath.py", line 184, in _build_path_iterator
selector.append(ops[token[0]](_next, token))
KeyError: ':'
Haben Sie versucht, Python API für Openoffice zu verwenden, um die Tabellen zu bearbeiten? – jfs
Hallo, ich benutze etree.QName für den Zugriff auf Elemente und Attribute mit Namespace. Es ist ein schöner Weg mit Hilfe eines Wörterbuchs von Namespaces, und es funktioniert auch mit finden und finden. Weitere Informationen finden Sie unter: http://lxml.de/tutorial.html#namespaces –