当前位置: 首页 > 面试题库 >

如何在lxml中的find / findall中使用xml名称空间?

慕容超
2023-03-14
问题内容

我正在尝试解析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: ':'

问题答案:

如果root.nsmap包含table名称空间前缀,则可以:

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

findall(path)接受{namespace}name语法而不是namespace:name。因此,path{namespace}name在将其传递给之前使用名称空间字典对该表单进行预处理findall()



 类似资料:
  • 问题内容: 我有以下格式的xml文档: 我需要使用lxml中的xpath检索所有元素。我的问题是我不知道如何使用空的名称空间。我尝试了以下示例,但没有用。请指教。 我尝试过的各种方法是: 要么 要么 在这一点上,我只是不知道该尝试什么。任何帮助是极大的赞赏。 问题答案: 这样的事情应该起作用: 另请参见http://lxml.de/xpathxslt.html#namespaces-and- pr

  • 问题内容: 我有一个需要打开并进行一些更改的xml文件,其中之一是删除名称空间和前缀,然后保存到另一个文件。这是xml: 我可以进行所需的其他更改,但是找不到如何删除名称空间和前缀的方法。这是我需要的reusklt xml: 这是我的脚本,它将打开并解析xml并将其保存: 那么,如何在脚本中添加代码以删除名称空间和前缀呢? 问题答案: 按照Uku Loskit的建议替换标签。除此之外,请使用lxm

  • 我试图使用名称空间从xml文件中选择一个xml节点。我已经有了一个选项,但第二个选项无法使用。 这是简化的xml(在python代码中存储为BookMetaData): 这是我到目前为止编写的python代码: 我尝试过的不起作用的东西: how-to-use-xpath-from-lxml-on-null-namessped-节点命名空间"http://www.idpf.org/2007/opf

  • 问题内容: 从使用python删除XML中的子元素开始… 感谢@Tichodroma,我有以下代码: 如果可以使用lxml,请尝试以下操作: 现在看起来像这样: 如何修改代码以从所有元素的标记名称中删除名称空间前缀? 问题答案: 从每个元素删除名称空间前缀的一种可能方法: 在xpath中有名称空间检查而不是使用statement的另一个版本:

  • 问题内容: 当我的XML看起来像这样(no )时,我可以使用XPath轻松查询它 但是当看起来像这样我就不能 有任何想法吗? 问题答案: 在第二个示例XML文件中,元素绑定到名称空间。你的XPath尝试处理绑定到默认“无名称空间”名称空间的元素,因此它们不匹配。 首选方法是使用名称空间前缀注册名称空间。它使你的XPath更加易于开发,读取和维护。 但是,并不一定要注册名称空间并在XPath中使用名

  • 问题内容: 我有一个像这样开始的XML文件: 我将不得不打开许多这些文件。它们中的每一个都有不同的名称空间,但一次只能有一个名称空间(我永远不会在一个xml文件中找到两个定义的名称空间)。 使用XPath,我希望有一种自动的方法将给定的名称空间添加到名称空间管理器中。到目前为止,我只能通过解析xml文件来获取名称空间,但是我有一个XPathNavigator实例,并且它应该具有一种不错且干净的方式