根据python xpath中另一个节点的值选择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

我正在尝试基于其他节点选择XML中的一个节点这里是我的XML示例


洞穴故事
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()”。格式(最新))
[“厄运”]