根据python xpath中另一个的值选择xml节点

杰米·摩根(Jamie Morgan)

我试图基于另一个节点在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文档的确已从另一个程序中更改,因此我无法更改条目的顺序

马丁·彼得斯(Martijn Pieters)

您的尝试有两个问题:

  • 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python Pandas根据另一个列中的总数从另一个dataFrame中选择值

根据另一个节点的属性使用属性值选择节点

如何使用XSLT根据另一个节点的内容获取XML节点的值?

如何根据另一个节点的值获取一个节点的值

根据AngularJS中另一个选择元素的值设置选择选项

根据动态表中的另一个选择选项选择选项值

根据 Angular 中另一个选择元素的值设置选择选项

MySQL:根据另一个表中的值过滤选择的值

Python DataFrame-根据另一个数据框中的值选择数据框行

根据Python中另一个数组的值选择数组元素的有效方法?

根据当前 XML 中的元素值,从另一个 XML 文件中获取元素

MySQL:根据另一个表中的第一个值选择表中的值

根据反应中另一个选择框的值动态加载一个选择框的选项

根据另一个元素的位置选择一个xpath元素

根据python中的索引用另一个列表的值替换列表中的值

如何根据 bootstrap/crispy 中的另一个选择字段值禁用输入字段?

根据另一个数组中的值对numpy数组的选择索引执行操作

在 R 中,如何让散点图根据另一个变量的值为点选择颜色?

SQLITE:如何根据另一个表中的不同列选择列值

在React中,如何根据另一个元素的事件设置选择的值

MySql根据另一个表中的MAX值选择一个表中的所有行

根据另一个选择显示一个选择的下拉值

根据上一个下拉选择选择另一个下拉值

python pandas:根据列表中列的另一个值设置列的值

使用R中的Xpath根据另一个属性及其父属性获取节点的属性

熊猫python从另一个列值中从列表列中随机选择值

根据同一个选择查询中的另一个值选择一个合并值?

根据一个表而不是另一个表中的值组合选择数据

AEM 6.2-根据对另一个下拉列表的选择,在一个下拉列表中设置值