[英]Problem traversing XML tree with Python xml.etree.ElementTree
[英]Traversing an XML tree without namespace in Python
我正在解析一个大型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解析的新手,所以我一直关注这一点 。 我有以下代码来读取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"))
即使<Body>
显然嵌套在<Envelope>
内,也None
打印。
编辑:按照马克·托隆宁(Mark Tolonen)的回答,我能够进入“ Body
标签,但是我如何才能超越此范围? 更具体地说,我想到达<TABLE>
标记。
您需要完全限定的名称,因为它是soap:Body
,所以您想使用xmlns:soap
值限定主体,该值(从您的Envelope示例中暗示)是:
print(root.find("./{http://schemas.xmlsoap.org/soap/envelope/}Body"))
除了XPath部分,您还需要注意文档的Namespaces部分 ,因为您的XML包含带有和不带有前缀的各种名称空间(后者称为默认名称空间)。 请注意, TABLE
元素从具有默认命名空间FetchReportResult
的最近祖先继承了命名空间。 因此,要查找TABLE
您需要使用大括号语法或前缀URI字典,使用默认的名称空间URI "URL2"
:
ns = { "u2": "URL2" }
tables = root.findall(".//u2:TABLE", ns)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.