J'essaie d'analyser le contenu d'une feuille de calcul OpenOffice ODS. Le format ods est essentiellement un fichier zip avec un certain nombre de documents. Le contenu de la feuille de calcul est stocké dans "content.xml".Comment utiliser les espaces de noms xml avec find/findall dans lxml?
import zipfile
from lxml import etree
zf = zipfile.ZipFile('spreadsheet.ods')
root = etree.parse(zf.open('content.xml'))
Le contenu de la feuille de calcul est dans une cellule:
table = root.find('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table')
Nous pouvons aussi aller directement pour les lignes:
rows = root.findall('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table-row')
Les éléments individuels connaissent les espaces de noms:
>>> table.nsmap['table']
'urn:oasis:names:tc:opendocument:xmlns:table:1.0'
Comment faire J'utilise les espaces de noms directement dans find/findall?
La solution évidente ne fonctionne pas.
Essayer d'obtenir les lignes de la table:
>>> 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: ':'
Avez-vous essayé d'utiliser l'API Python pour OpenOffice pour traiter les feuilles de calcul? – jfs
Salut J'utilise etree.QName pour accéder à Elements et attributs avec Namespace. C'est une manière soignée avec l'aide d'un dictionnaire d'espaces de noms, et cela fonctionne aussi avec la méthode find et findall. Pour plus d'informations, veuillez vous référer à: http://lxml.de/tutorial.html#namespaces –