33

OpenOffice ODS スプレッドシートのコンテンツを解析しようとしています。ods 形式は基本的に、多数のドキュメントを含む単なる zip ファイルです。スプレッドシートの内容は「content.xml」に保存されます。

import zipfile
from lxml import etree

zf = zipfile.ZipFile('spreadsheet.ods')
root = etree.parse(zf.open('content.xml'))

スプレッドシートの内容はセルにあります。

table = root.find('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table')

行を直接取得することもできます。

rows = root.findall('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table-row')

個々の要素は、名前空間について知っています。

>>> table.nsmap['table']
'urn:oasis:names:tc:opendocument:xmlns:table:1.0'

find/findall で名前空間を直接使用するにはどうすればよいですか?

明らかな解決策は機能しません。

テーブルから行を取得しようとしています:

>>> 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: ':'
4

4 に答える 4

27

root.nsmap名前空間プレフィックスが含まれている場合は、次のtableことができます。

root.xpath('.//table:table', namespaces=root.nsmap)

findall(path){namespace}nameの代わりに構文を受け入れますnamespace:name。したがって、フォームに名前空間ディクショナリを渡す前pathに、フォームに名前空間ディクショナリを使用して前処理する必要があります。{namespace}namefindall()

于 2010-11-18T01:39:20.500 に答える
11

XML ドキュメント内のすべての名前空間を取得する方法を次に示します (接頭辞の競合がないと仮定します)。

名前空間の URL が何であるかが事前にわかっていて、接頭辞だけがわかっている XML ドキュメントを解析するときに、これを使用します。

        doc = etree.XML(XML_string)

        # Getting all the name spaces.
        nsmap = {}
        for ns in doc.xpath('//namespace::*'):
            if ns[0]: # Removes the None namespace, neither needed nor supported.
                nsmap[ns[0]] = ns[1]
        doc.xpath('//prefix:element', namespaces=nsmap)
于 2013-12-19T18:34:06.740 に答える