Sto cercando di analizzare il contenuto in un foglio di calcolo ODS di OpenOffice. Il formato ods è essenzialmente solo un file zip con un numero di documenti. Il contenuto del foglio di calcolo è memorizzato in "content.xml".Come utilizzare gli spazi dei nomi xml con find/findall in lxml?
import zipfile
from lxml import etree
zf = zipfile.ZipFile('spreadsheet.ods')
root = etree.parse(zf.open('content.xml'))
Il contenuto del foglio di calcolo è in una cella:
table = root.find('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table')
Possiamo anche andare dritto per le righe:
rows = root.findall('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table-row')
I singoli elementi conoscono gli spazi dei nomi:
>>> table.nsmap['table']
'urn:oasis:names:tc:opendocument:xmlns:table:1.0'
Come fare Io uso gli spazi dei nomi direttamente in find/findall?
La soluzione ovvia non funziona.
Cercando di ottenere le righe della tabella:
>>> 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: ':'
Hai provato a usare Python API per OpenOffice per elaborare i fogli di calcolo? – jfs
Ciao Sto usando etree.QName per accedere a Elements e attributes con Namespace. è un modo pernicioso con l'aiuto di un dizionario di spazi dei nomi, e funziona anche con il metodo find e findall. per ulteriori informazioni, consultare: http://lxml.de/tutorial.html#namespaces –