gpt4 book ai didi

python - python lxml 中的 XQuery 绝对路径

转载 作者:太空宇宙 更新时间:2023-11-03 17:20:40 25 4
gpt4 key购买 nike

我有一个 XML 文档,我想从中提取特定节点 (mynode) 的绝对路径以供以后使用。我像这样检索节点:

from StringIO import StringIO
from lxml import etree

xml = """
<a1>
<b1>
<c1>content1</c1>
</b1>
<b1>
<c1>content2</c1>
</b1>
</a1>"""
root = etree.fromstring(xml)

i = 0
mynode = root.xpath('//c1')[i]

为了获取我当前使用的路径

ancestors = mynode.xpath('./ancestor::*')
p = ''.join( map( lambda x: '/' + x.tag , ancestors ) + [ '/' , mynode.tag ] )

p 现在有值

/a1/b1/c1

但是,为了存储路径以供以后使用,我还必须存储第一个代码片段中的索引 i,以便检索正确的节点,因为 p 的 xpath 查询将包含两个节点 c1。我不想存储该索引。

更好的是包含索引的 xquery 路径。对于第一个 c1 节点,它可能如下所示:

/a1/b1[1]/c1

或者第二个 c1 节点是这样的

/a1/b1[2]/c1

有人知道如何实现这一目标吗?是否有另一种方法来指定节点并稍后访问它?

最佳答案

from lxml import etree
from io import StringIO, BytesIO

# ----------------------------------------------

def node_location(node):
position = len(node.xpath('./preceding-sibling::' + node.tag)) + 1
return '/' + node.tag + '[' + str(position) + ']'

def node_path(node):
nodes = mynode.xpath('./ancestor-or-self::*')
return ''.join( map(node_location, nodes) )

# ----------------------------------------------

xml = """
<a1>
<b1>
<c1>content1</c1>
</b1>
<b1>
<c1>content2</c1>
</b1>
</a1>"""

root = etree.fromstring(xml)

for mynode in root.xpath('//c1'):
print node_path(mynode)

打印

/a1[1]/b1[1]/c1[1]/a1[1]/b1[2]/c1[1]
<小时/>

Is there another method to specify a node and access it later on?

如果您的意思是“在程序的单独调用中持续存在”,那么不,不是真的。

关于python - python lxml 中的 XQuery 绝对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33200150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com