如何解决具有两个条件的lxml XPath搜索
我的XML文件是:
<releases>
<release id="1">
<title>Title1</title>
<formats>
<format name="CD" qty="2" text="">
</format>
</formats>
<released>2016-02-00</released>
</release>
<release id="2">
<title>Title2</title>
<formats>
<format name="LP" qty="2" text="">
</format>
</formats>
<released>2018-03-00</released>
</release>
<release id="3">
<title>Title3</title>
<formats>
<format name="CD" qty="1" text="">
</format>
</formats>
<released>1995-01-15</released>
</release>
</releases>
在Python3中,我想找到版本ID,其中“格式”名称=“ CD”,“已发布”文本包含文本“ 1995”(因此应为版本ID 3)
我有这段代码可以找到CD发行版,并打印发行日期:
for rls in root.findall(".//format[@name='CD']....//released"):
print (rls.tag,rls.attrib,rls.text)
我也有这段代码,可以找到所有带有“ 1995”的版本,并打印出第一个结果的日期:
print (root.xpath("/releases/release/released[contains(text(),'1995')]")[0].text)
我在查找如何将两者结合时遇到了麻烦(而且我在一个中使用findall
,而在另一个中使用xpath
,这并不美观)。
解决方法
您可以在XPath中的选择器的谓词部分中组合条件。下面告诉XPath:
- 返回所有
release
个节点,这些节点包含:- 具有
format
和 属性的 - 一个
released
节点,文本中包含1995
,
name=CD
节点 - 具有
xml.xpath("./release[.//format[@name='CD'] and .//released[contains(text(),'1995')]]/@id")
# returns:
['3']
,
此XPath,
/releases/release[formats/format/@name='CD'][starts-with(released,'1995')]
将选择release
日期以CD
开头的released
格式的1995
个元素,
<release id="3">
<title>Title3</title>
<formats>
<format name="CD" qty="1" text="">
</format>
</formats>
<released>1995-01-15</released>
</release>
根据要求。
您提到需要id
属性。如果您确实想遍历所有此类id
属性而不是元素本身,则只需将/@id
附加到上述XPath中即可。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。