根据python xpath中另一个节点的值选择xml节点
我正在尝试基于其他节点选择XML中的一个节点这里是我的XML示例根据python xpath中另一个节点的值选择xml节点,python,xml,xpath,Python,Xml,Xpath,我正在尝试基于其他节点选择XML中的一个节点这里是我的XML示例 洞穴故事 1. 死亡 2. 毁灭公爵3D 我已经有了代码来查找的最高值,并将其存储为最新值,但我正在努力使用XPath来获取匹配的名称。我正在使用python,我认为XPath应该是 //gameList/game/[lastplayed=newest]/name" 但是当我试图用python输出它时,它似乎不起作用 import lxml.etree as ET root = ET.parse("./gamelist.xm
洞穴故事
1.
死亡
2.
毁灭公爵3D
我已经有了代码来查找
的最高值,并将其存储为最新值,但我正在努力使用XPath来获取匹配的名称。我正在使用python,我认为XPath应该是
//gameList/game/[lastplayed=newest]/name"
但是当我试图用python输出它时,它似乎不起作用
import lxml.etree as ET
root = ET.parse("./gamelist.xml")
newest = 2
gname = root.xpath(".//gamelist/game/[lastplayed=newest]/name")
此时我得到xpathevaleror:Invalid expression
我觉得我缺少一些小东西来解释为什么这对我不起作用
注意:为简化起见,我已经手动声明了最新版本,但这将通过一些我已经准备好的编码来完成,并且此XML文档确实从另一个程序中更改,因此我无法更改条目的顺序。您的尝试有两个问题:
- XPath表达式中的最新不是动态的;它未连接到代码中最新的
变量
- 您正在使用语法查找标记上的属性,而不是标记中的文本内容
lastplayed
等于newest
的内容。没有此类匹配项,并且您的表达式不完整
要将lastplayed
元素与特定文本匹配,请使用[lastplayed/text()=“specific text”]
。您必须使用Python字符串格式将newest
的值输入到该表达式中。您正在此处查找同级匹配,因此请选择子元素文本匹配的父元素:
root.xpath(".//game[lastplayed/text()='{}']/name/text()".format(newest))
我已经离开了游戏列表
(区分大小写!)根目录,这里没有必要限制对根目录的搜索
因此,这将查找具有特定文本的
子元素的
元素。找到后,它选择
子元素,从该标记中提取文本:
>>> import lxml.etree as ET
>>> sample = '''\
... <?xml version="1.0"?>
... <gameList>
... <game>
... <name>Cave Story</name>
... <lastplayed>1</lastplayed>
... </game>
... <game>
... <name>Doom</name>
... <lastplayed>2</lastplayed>
... </game>
... <game>
... <name>Duke Nukem 3D</name>
... </game>
... </gameList>
... '''
>>> root = ET.fromstring(sample)
>>> root.xpath(".//game[lastplayed/text()='{}']/name/text()".format(newest))
['Doom']
>>将lxml.etree作为ET导入
>>>样本='''\
...
...
...
... 洞穴故事
... 1.
...
...
... 死亡
... 2.
...
...
... 毁灭公爵3D
...
...
... '''
>>>root=ET.fromstring(示例)
>>>xpath(“.//game[lastplayed/text()='{}']/name/text()”。格式(最新))
[“厄运”]