【问题标题】:lxml XPath search with two conditionslxml XPath 搜索有两个条件
【发布时间】:2020-08-23 12:36:09
【问题描述】:

我的 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 中,我想查找“格式”名称 =“CD”且“已发布”文本包含文本“1995”的版本 ID(因此版本 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,不漂亮)。

【问题讨论】:

    标签: python xml xpath lxml


    【解决方案1】:

    您可以在 XPath 中组合选择器的谓词部分中的条件。下面告诉 XPath:

    • 返回所有release 节点,其中包含:
      • 具有name=CD属性的format节点
      • 一个released 节点,其中包含1995 的文本
    xml.xpath("./release[.//format[@name='CD'] and .//released[contains(text(),'1995')]]/@id")
    # returns:
    ['3']
    

    【讨论】:

    • 谢谢。适用于 2GB xml 文件。在 55GB 文件上运行它,RAM(32GB)和交换空间(另外 32GB)在 5 分钟内用完,python 脚本以“Killed”结尾。有没有一种方法可以随时释放内存,或者一种内存密集度较低的方法?如果没有,我会将文件分成几块,一次做一个。
    【解决方案2】:

    这个 XPath,

    /releases/release[formats/format/@name='CD'][starts-with(released,'1995')]
    

    将选择CD格式的release元素,其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 即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 2022-01-13
      • 1970-01-01
      • 2022-01-23
      • 2012-04-07
      • 2017-03-29
      相关资源
      最近更新 更多