我对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文件:
<?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文件:
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}")发布于 2022-06-16 18:48:25
在这种情况下,可以使用变量替换:
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)发布于 2022-06-16 17:13:45
用于搜索@Id属性等于上下文@Ref属性的任何REF的xpath可能是
res_1 = xml_root.xpath("//REF[@Id = //CONTEXT/@Ref]/FIND")
print(f"Xpath Result: {res_1}")注意,xpath是从根搜索的。
才能得到第一个
//REF[@Id = //CONTEXT[1]/@Ref]/FINDhttps://stackoverflow.com/questions/72649304
复制相似问题