gpt4 book ai didi

python - 在 Python 中使用 XPath 和 LXML

转载 作者:太空宇宙 更新时间:2023-11-04 10:06:45 28 4
gpt4 key购买 nike

我有一个 python 脚本,用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中。我现在尝试更改脚本以允许根据条件过滤 XML 文件,等效的 XPath 查询将是:

\DC\Events\Confirmation[contains(TransactionId,"GTEREVIEW")]

当我尝试使用 lxml 这样做时,我的代码是:

xml_file = lxml.etree.parse(xml_file_path)
namespace = "{" + xml_file.getroot().nsmap[None] + "}"
node_list = xml_file.findall(namespace + "Events/" + namespace + "Confirmation[TransactionId='*GTEREVIEW*']")

但这似乎行不通。谁能帮忙?XML 文件示例:

<Events>
<Confirmation>
<TransactionId>GTEREVIEW2012</TransactionId>
</Confirmation>
<Confirmation>
<TransactionId>GTEDEF2012</TransactionId>
</Confirmation>
</Events>

因此,我希望所有包含事务 ID 的“确认”节点都包含字符串“GTEREVIEW”。谢谢

最佳答案

findall() 不支持 XPath 表达式,仅支持 ElementPath(参见 https://web.archive.org/web/20200504162744/http://effbot.org/zone/element-xpath.htm)。 ElementPath 不支持搜索包含特定字符串的元素。

为什么不使用 XPath?假设文件 test.xml 包含您的示例 XML,则以下工作:

> python
Python 2.7.9 (default, Jun 29 2016, 13:08:31)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> from lxml import etree
>>> tree=etree.parse("test.xml")
>>> tree.xpath("Confirmation[starts-with(TransactionId, 'GTEREVIEW')]")
[<Element Confirmation at 0x7f68b16c3c20>]

如果你坚持使用 findall(),你能做的最好的事情就是获取所有具有 TransactionId 子元素的 Confirmation 元素的列表节点:

>>> tree.findall("Confirmation[TransactionId]")
[<Element Confirmation at 0x7f68b16c3c20>, <Element Confirmation at 0x7f68b16c3ea8>]

然后您需要手动过滤此列表,例如:

>>> [e for e in tree.findall("Confirmation[TransactionId]")
if e[0].text.startswith('GTEREVIEW')]
[<Element Confirmation at 0x7f68b16c3c20>]

如果您的文档包含命名空间,则以下内容将为您提供所有具有 TransactionId 子节点的 Confirmation 元素,前提是这些元素使用默认命名空间(我使用 xmlns="file:xyz" 作为默认命名空间):

>>> tree.findall("//{{{0}}}Confirmation[{{{0}}}TransactionId]".format(tree.getroot().nsmap[None]))
[<Element {file:xyz}Confirmation at 0x7f534a85d1b8>, <Element {file:xyz}Confirmation at 0x7f534a85d128>]

当然还有etree.ETXPath:

>>> find=etree.ETXPath("//{{{0}}}Confirmation[starts-with({{{0}}}TransactionId, 'GTEREVIEW')]".format(tree.getroot().nsmap[None]))
>>> find(tree)
[<Element {file:xyz}Confirmation at 0x7f534a85d1b8>]

这允许您组合 XPath 和命名空间。

关于python - 在 Python 中使用 XPath 和 LXML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40618625/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com