【问题标题】:Python 2.7 libxml2, XPath, extract xml attributesPython 2.7 libxml2,XPath,提取xml属性
【发布时间】:2012-04-03 01:52:39
【问题描述】:

我有以下代码:

import libxml2
import sys

def xpath_grep(query, file):
    doc = libxml2.parseDoc(file)
    for matched_region in doc.xpathEval(query):
        matched_region.saveTo(sys.stdout, format = True) # add match to stdout

if __name__ == '__main__':
    if len(sys.argv) <= 1:
        # default arguments
        query = "data(bn/variable/@name)"
        files = ["burglary_bn.xml"]
    else:
        query = sys.argv[1]
        files = sys.argv[2:]

    for xml_file in files:
        xpath_grep(query, file(xml_file).read())

虽然我认为“数据”函数应该检索 XML 属性的值,但事实并非如此。相反,它给了我一个错误:

xmlXPathCompOpEval: function data not found
Unregistered function
...
libxml2.xpathError: xmlXPathEval() failed

我做错了什么?

编辑:XPath 数据函数的文档可以在这里找到: http://www.w3.org/TR/xpath-functions/#func-data

【问题讨论】:

  • data() 函数仅在 XPath 2.0 处理器中可用——它不是由 XPath 1.0 处理器实现的,例如 libxml。

标签: python xpath libxml2


【解决方案1】:

您不需要调用 xpath 函数来获取属性的值。例如,给定以下 XML 文档:

<doc>
  <section>
    <person name="bob" color="blue"/>
  </section>
</doc>

这段 Python 代码将为我提供 name 属性的值:

>>> doc = libxml2.parseDoc(open('input.xml').read())
>>> str(doc.xpathEval('//person/@name')[0].children)
'bob'

我以前从未使用过libxml2 模块,因此可能有更好的方法。我总是使用lxml etree 模块,使用它我们可以完成同样的事情:

>>> import lxml.etree as etree
>>> d = etree.parse(open('foo.xml'))
>>> d.xpath('//person/@name')[0]
'bob'

如果可以使用,ElementTree (etree) API 会更容易使用。

【讨论】:

    【解决方案2】:

    data() 是 XPath 2.0 函数,未在 XSLT 1.0 处理器中实现,例如 libxml

    您需要计算以下表达式:

    bn/variable/@name
    

    并迭代地(在 Python 中)获取每个选定节点的字符串值。

    【讨论】:

      【解决方案3】:

      您没有定义函数 data(),或者至少您没有导入具有子模块名称 data 的正确模块。 在您的代码中:

      query = "data(bn/variable/@name)"
      

      看起来很奇怪。为什么要调用这样的函数,如果数据函数可用,它究竟会做什么?

      【讨论】:

      • data 是一个 XPath 函数。请阅读 XPath 文档。
      • 因为他把 data() 称为一个独立的函数,所以我认为澄清他的问题是合理的。 @BackSheep:否决我的回答不是一个好的行动想法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 2012-07-26
      相关资源
      最近更新 更多