Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python libxml2 XPath/名称空间帮助_Python_Libxml2 - Fatal编程技术网

Python libxml2 XPath/名称空间帮助

Python libxml2 XPath/名称空间帮助,python,libxml2,Python,Libxml2,我试图学习如何使用这个示例XML文件从Python执行XPath查询:我只是在其中添加了一个名称空间,因为我的实际应用程序使用它 基本上,我希望执行一个顶级查询,返回一个子集的节点,然后查询该子集(规模比本例大得多) 这是我的代码,首先查找所有节点,然后迭代每个节点的描述 #!/usr/bin/python2 import libxml2 doc = libxml2.parseFile("simple.xml") context = doc.xpathNewContext() contex

我试图学习如何使用这个示例XML文件从Python执行XPath查询:我只是在其中添加了一个名称空间,因为我的实际应用程序使用它

基本上,我希望执行一个顶级查询,返回一个子集的节点,然后查询该子集(规模比本例大得多)

这是我的代码,首先查找所有
节点,然后迭代每个节点的描述

#!/usr/bin/python2

import libxml2

doc = libxml2.parseFile("simple.xml")
context = doc.xpathNewContext()

context.xpathRegisterNs("db", "http://examplenamespace.com")
res = context.xpathEval("//db:food")

for node in res:
    # Query xmlNode here
    print "Got Food Node:"
    desc = node.xpathEval('db:description') # this is wrong?
    print desc
因此,这本质上是一个名称空间问题,如果我从XML文件中删除
xlns
属性,并且只使用基本的XPATH查询,而不使用
db:
,它就可以正常工作。顶部的查询
//db:food
工作正常,但第二个查询无法进行计算

请有人纠正我的命名空间/查询语法


非常感谢

我通常不使用libxml2,我更喜欢lxml.etree

在附近玩了一场。节点上的
xpathEval
方法每次都会创建一个新上下文,显然没有您注册的名称空间

您可以将上下文重置到不同的位置,如下所示:

>>> import libxml2
>>> from urllib2 import urlopen
>>> data = urlopen('http://pastie.org/pastes/1333021/download').read()
>>>
>>> doc = libxml2.parseMemory(data,len(data))
>>>
>>> context = doc.xpathNewContext()
>>> context.xpathRegisterNs("db", "http://examplenamespace.com")
0
>>>
>>> for res in context.xpathEval("//db:food"):
...     context.setContextNode(res)
...     print "Got Food Node:"
...     desc = context.xpathEval('./db:description')[0]
...     print desc
...
Got Food Node:
<description>two of our famous Belgian Waffles with plenty of real maple syrup</description>
Got Food Node:
<description>light Belgian waffles covered with strawberries and whipped cream</description>
Got Food Node:
<description>light Belgian waffles covered with an assortment of fresh berries and whipped cream</description>
Got Food Node:
<description>thick slices made from our homemade sourdough bread</description>
Got Food Node:
<description>two eggs, bacon or sausage, toast, and our ever-popular hash browns</description>
导入libxml2 >>>从urllib2导入urlopen >>>数据=urlopen('http://pastie.org/pastes/1333021/download)。读() >>> >>>doc=libxml2.parseMemory(数据,len(数据)) >>> >>>context=doc.xpathNewContext() >>>xpathRegisterNs(“db”http://examplenamespace.com") 0 >>> >>>对于context.xpathEval(//db:food)中的res: ... context.setContextNode(res) ... 打印“获取食物节点:” ... desc=context.xpathEval('./db:description')[0] ... 打印说明 ... 获取食物节点: 我们的两个著名的比利时华夫饼干,里面有很多真正的枫糖浆 获取食物节点: 覆盖草莓和鲜奶油的淡比利时华夫饼干 获取食物节点: 淡比利时华夫饼干,上面覆盖着各种新鲜浆果和鲜奶油 获取食物节点: 用我们自制的酸面包做成的厚片 获取食物节点: 两个鸡蛋,培根或香肠,土司,还有我们一直受欢迎的炸土豆条
非常感谢,我想我对上下文更改感到困惑:)