我有以下代码:
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
3 回答
您不需要调用xpath函数来获取属性的值 . 例如,给定以下XML文档:
这个Python代码将获得
name
属性的值:我以前从未使用过
libxml2
模块,因此可能有更好的方法 . 我总是使用lxml
etree
模块,使用它我们可以完成同样的事情:如果您可以使用它,
ElementTree
(etree)API更容易使用 .data() is an XPath 2.0 function and isn't implemented in an XSLT 1.0 processor, like libxml .
您需要评估以下表达式:
迭代地(在Python中)获取每个选定节点的字符串值 .
您没有定义函数data(),或者至少没有导入具有子模块名称 data 的正确模块 . 在你的代码中:
看起来很奇怪 . 为什么要调用这样的函数,如果数据函数可用,它究竟会做什么?