首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中遍历没有命名空间的XML树

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

Stack Overflow用户
提问于 2018-01-21 21:36:18
回答 2查看 564关注 0票数 1

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

代码语言:javascript
复制
<?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解析很陌生,所以我关注。我有下面的代码来读取和XML文件,并创建一个ElementTree对象。

代码语言:javascript
复制
import xml.etree.ElementTree as ET

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

这可以理解地打印如下:

代码语言:javascript
复制
<Element '{http://schemas.xmlsoap.org/soap/envelope/}Envelope' at 0x00000230CAC23318>

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

代码语言:javascript
复制
print(root.find("./Body"))

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

编辑:按照Mark的回答,我找到了Body标签,但是我如何超越这个标签呢?更具体地说,我想到达<TABLE>标记。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-22 02:26:32

除了XPath部分之外,您还需要注意文档的https://docs.python.org/2/library/xml.etree.elementtree.html#parsing-xml-with-namespaces,因为您的https://docs.python.org/2/library/xml.etree.elementtree.html#parsing-xml-with-namespaces包含各种名称空间,有前缀和没有前缀(前缀称为默认名称空间)。注意,TABLE元素使用默认名称空间:FetchReportResult从最近的祖先继承名称空间。因此,要找到TABLE,您需要使用默认的命名空间URI "URL2",或者使用大括号语法,或者使用前缀-URI字典:

代码语言:javascript
复制
ns = { "u2": "URL2" }
tables = root.findall(".//u2:TABLE", ns)
票数 1
EN

Stack Overflow用户

发布于 2018-01-21 21:46:42

您需要完全限定的名称,因为它是soap:Body,所以需要用xmlns:soap值限定主体,这个值(从信封示例中得到)是:

代码语言:javascript
复制
print(root.find("./{http://schemas.xmlsoap.org/soap/envelope/}Body"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48371969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档