首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.xpath()方法上下文节点在谓词中没有正确识别?

.xpath()方法上下文节点在谓词中没有正确识别?
EN

Stack Overflow用户
提问于 2022-06-16 16:48:45
回答 2查看 173关注 0票数 2

我对Python的Packet (lxml 4.8.0)有一个问题。我使用的是.xpath()方法,它并没有像我想的那样表现。

下面的XML文件有一个元素上下文。我用一个.xpath()表达式找到了这个表达式,并将它存储在变量tmp (type(tmp) --> lxml.etree._Element)中。

据我理解,变量tmp现在是上下文节点。现在,当我再次使用tmp.xpath()输入搜索路径时,我希望这个搜索路径"tmp.xpath('//REF[@Id = @Ref]/FIND')“的查找元素(<FIND Solution="1129"/>),但是我没有得到任何结果。

因此,很明显,在谓词中,关联的属性@Ref是不被识别的。但是,如果我使用以下搜索表达式(tmp.xpath('//REF[@Id = //CONTEXT[@Ref = @Ref]/@Ref]/FIND')),就会找到正确的FIND元素。在这里,正确地识别上下文节点的@Ref属性。

为什么会这样呢?

XML文件:

代码语言:javascript
复制
<?xml version="1.0"?>
<FOO>
    <BAR>
        <CONTEXT Id="SW-1" Ref="Find-3"/>
        <CONTEXT Id="SW-2" Ref="Not-3"/>
    </BAR>      
    <FUU>
        <REF Id="Find-1">
            <FIND Solution="1121"/>
        </REF>
        <REF Id="Find-2">
            <FIND Solution="1222"/>
        </REF>
        <REF Id="Find-3">
            <FIND Solution="1129"/>
        </REF>
        <REF Id="Find-4">
            <FIND Solution="1100"/>
        </REF>
        <REF Id="Find-5">
            <FIND Solution="1205"/>
        </REF>
    </FUU>
</FOO>

Python文件:

代码语言:javascript
复制
import os, sys
import lxml
from lxml import etree
import xml.etree.ElementTree as ET

print("Hello")

dir = os.path.dirname(os.path.realpath(__file__))
xml = os.path.join(dir, "test2.xml")

print(f"xml file    : {xml}")
print()

xml_root = lxml.etree.parse(xml)
print(f"xml parse   : {xml_root}")
print(f"xml parse   : {type(xml_root)}")

tmp = xml_root.xpath("//CONTEXT[1]")[0]

print(f"Xpath Result: {tmp}     {type(tmp)}")

res_1 = tmp.xpath("//REF[@Id = //CONTEXT[@Ref = @Ref]/@Ref]/FIND")
print(f"Xpath Result: {res_1}")

res_2 = tmp.xpath("//REF[@Id = @Ref]/FIND")
print(f"Xpath Result: {res_2}")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-16 18:48:25

在这种情况下,可以使用变量替换:

代码语言:javascript
复制
from lxml import etree

# parse XML
doc = etree.fromstring(xml)

# create variable "tmp"
tmp = doc.xpath('//CONTEXT[@Id="SW-1"]')[0]

# value of the attribute "Ref" is used as a variable "ref", which is passed to the XPath expression
result = tmp.xpath('//REF[@Id = $ref]/FIND/@Solution', ref = tmp.get('Ref'))

print(result)
票数 2
EN

Stack Overflow用户

发布于 2022-06-16 17:13:45

用于搜索@Id属性等于上下文@Ref属性的任何REF的xpath可能是

代码语言:javascript
复制
res_1 = xml_root.xpath("//REF[@Id = //CONTEXT/@Ref]/FIND")
print(f"Xpath Result: {res_1}")

注意,xpath是从根搜索的。

才能得到第一个

代码语言:javascript
复制
//REF[@Id = //CONTEXT[1]/@Ref]/FIND
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72649304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档