gpt4 book ai didi

python - 在 Python 中遍历没有命名空间的 XML 树

转载 作者:行者123 更新时间:2023-12-01 02:16:04 25 4
gpt4 key购买 nike

我正在解析一个大型 XML 文件,该文件本质上包含一个表。 XML 中的节点并不总是有名称。嵌套在多个标签的深处基本上是一个类似 HTML 的表格,其中包含 <TD>行 ( <TR> ) 标签内包含原始(数字)数据。现在,在我可以迭代到表之前,有一大堆我不感兴趣的元数据标签。例如:

<?xml version="1.0" ?>
<soap:Envelope xmlns:soap="--ommitted--" xmlns:xsi="--ommitted--">
<soap:Body>
<FetchReportResponse xmlns="URL1">
<FetchReportResult xmlns="URL2">
<REPORT>
<TITLE>CROSS VISITING REPORT</TITLE>
<SUBTITLE/>
<SUMMARY>
<GEOGRAPHY>--ommitted--</GEOGRAPHY>
<LOCATION>--ommitted--</LOCATION>
<TIMEPERIOD>--ommitted--</TIMEPERIOD>
<TARGET>--ommitted--</TARGET>
<MEDIA>--ommitted--</MEDIA>
<DATE>--ommitted--</DATE>
<USER>--ommitted--</USER>
</SUMMARY>
<TABLE>
<THEAD>
<TR>
<TH>--ommitted--</TH>
<TD>--ommitted--</TD>
<TD>--ommitted--</TD>
<TD>--ommitted--</TD>
<TD>--ommitted--</TD>
<TD>--ommitted--</TD>
<TD>--ommitted--</TD>

我是 XML 解析新手,所以我关注 this 。我有以下代码来读取 XML 文件并创建 ElementTree 对象。

import xml.etree.ElementTree as ET

tree = ET.parse('./../filename.xml')
print(root.find("./"))

这可以理解地打印以下内容:

<Element '{http://schemas.xmlsoap.org/soap/envelope/}Envelope' at 0x00000230CAC23318>

但是,当我尝试使用 XPath 约定从这里遍历它时,我无法做到。例如,

print(root.find("./Body"))

打印None ,尽管 <Body>显然嵌套在 <Envelope> 内。

编辑:根据 Mark Tolonen 的回答,我能够找到 Body标签,但我该如何超越它呢?更具体地说,我想到达 <TABLE>标签。

最佳答案

除了XPath部分之外,您还需要注意the Namespaces section文档的,因为您的 XML 包含各种 namespace ,有或没有前缀(后者称为默认 namespace )。请注意,TABLE 元素从最近的祖先继承命名空间,默认命名空间为:FetchReportResult。因此,要查找 TABLE,您需要使用默认命名空间 URI "URL2",可以使用大括号语法或使用前缀 URI 字典:

ns = { "u2": "URL2" }
tables = root.findall(".//u2:TABLE", ns)

关于python - 在 Python 中遍历没有命名空间的 XML 树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48371969/

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