我试图基于另一个节点在XML中选择一个节点,这是我的XML的示例
<?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>
我已经有代码来查找最大值,<lastplayed>
并将其存储为最新值,但是我在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")
至此我明白了XPathEvalError: Invalid expression
。
我觉得为什么这对我不起作用,我缺少一些小东西。
注意:为简化起见,我手动声明了最新的,但这将通过已经存在的一些编码来完成,并且此XML文档的确已从另一个程序中更改,因此我无法更改条目的顺序
您的尝试有两个问题:
newest
在XPath表达式中不是动态的;它未连接到newest
代码中的变量。
您正在使用语法来寻找一个属性上的标签,而不是文本内容的标签。
因此,您正在寻找属性lastplayed
等于的东西newest
。没有这样的匹配项,您的表达不完整。
要将lastplayed
元素与特定文本匹配,请使用[lastplayed/text()="specific text"]
。您必须使用Python字符串格式来newest
将表达式的值获取。您正在此处寻找同级匹配,因此请选择与子元素文本匹配的父元素:
root.xpath(".//game[lastplayed/text()='{}']/name/text()".format(newest))
我离开了gameList
(区分大小写!)根目录,这里没有必要将搜索限制到根目录。
因此,此查找<game>
元素具有<lastplayed>
包含您的特定文本的子元素。找到后,它将选择<name>
子元素,并从该标记中获取文本:
>>> 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']
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句