Estoy tratando de analizar el contenido en una hoja de cálculo de OpenOffice ODS. El formato de ods es esencialmente solo un archivo zip con una cantidad de documentos. El contenido de la hoja de cálculo se almacena en 'content.xml'.¿Cómo uso los espacios de nombres xml con find/findall en lxml?
import zipfile
from lxml import etree
zf = zipfile.ZipFile('spreadsheet.ods')
root = etree.parse(zf.open('content.xml'))
El contenido de la hoja de cálculo está en una celda:
table = root.find('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table')
También podemos ir directamente a las filas:
rows = root.findall('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table-row')
Los elementos individuales saben acerca de los espacios de nombres:
>>> table.nsmap['table']
'urn:oasis:names:tc:opendocument:xmlns:table:1.0'
Cómo hacer Uso los espacios de nombres directamente en find/findall?
La solución obvia no funciona.
Tratando de conseguir las filas de la tabla:
>>> 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: ':'
Ha intentado utilizar la API de Python para OpenOffice para procesar las hojas de cálculo? – jfs
Hola, estoy usando etree.QName para acceder a Elementos y atributos con Namespace. es una manera ordenada con la ayuda de un diccionario de espacios de nombres, y también funciona con el método find y findall. para obtener más información, consulte: http://lxml.de/tutorial.html#namespaces –