Python libxml2 XPath/名称空间帮助
我试图学习如何使用这个示例XML文件从Python执行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
节点,然后迭代每个节点的描述
#!/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]
... 打印说明
...
获取食物节点:
我们的两个著名的比利时华夫饼干,里面有很多真正的枫糖浆
获取食物节点:
覆盖草莓和鲜奶油的淡比利时华夫饼干
获取食物节点:
淡比利时华夫饼干,上面覆盖着各种新鲜浆果和鲜奶油
获取食物节点:
用我们自制的酸面包做成的厚片
获取食物节点:
两个鸡蛋,培根或香肠,土司,还有我们一直受欢迎的炸土豆条
非常感谢,我想我对上下文更改感到困惑:)