【问题标题】:Parse XML where an element prefix is defined in the same element解析在同一元素中定义元素前缀的 XML
【发布时间】:2018-10-27 11:42:46
【问题描述】:

我有一个包含如下元素的 XML 文件:

<wrapping_element>
    <prefix:tag xmlns:prefix="url">value</prefix:tag>
</wrapping_element>

我想得到这个元素,所以我使用lxml如下:

wrapping_element.find('prefix:tag', wrapping_element.nsmap)

但我收到以下错误:SyntaxError: prefix 'prefix' not found in prefix map,因为在到达 XML 中的此元素之前未定义 prefix

有没有办法获取元素?

【问题讨论】:

  • 我认为问题在于 wrapping_element.nsmap 是空的。我什至在文档迷宫中都没有找到find,但似乎也有一个方法xpath,也许你可以使用它。
  • @ArndtJonasson 问题是,xpath 需要 namespaces 参数,就像 find 一样。我的问题是我找不到没有元素的方法来检索命名空间,也找不到没有命名空间的元素。
  • wrapping_element.xpath('/*/*[local-name()="tag"]') 怎么样?
  • @ArndtJonasson 太棒了!我使用了相对路径:wrapping_element.xpath('./*[local-name()="tag"]'),它运行良好。非常感谢!

标签: python xml xml-parsing lxml xml-namespaces


【解决方案1】:

就像 cmets 中提到的那样,您可以使用 local-name() 绕过命名空间,但直接在 xpath() 调用中处理命名空间就足够简单了...

from lxml import etree

tree = etree.parse("input.xml")

wrapping_element = tree.xpath("/wrapping_element")[0]
tag = wrapping_element.xpath("x:tag", namespaces={"x": "url"})[0]

print(etree.tostring(tag, encoding="unicode"))

这将打印...

<prefix:tag xmlns:prefix="url">value</prefix:tag>

注意我使用了前缀x。前缀可以匹配 XML 文件中的前缀,但不是必须的;只有命名空间 URI 需要完全匹配。

更多详情请看这里:http://lxml.de/xpathxslt.html#namespaces-and-prefixes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多