我正在解析一个大型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"))打印None,尽管<Body>显然嵌套在<Envelope>中。
编辑:按照Mark的回答,我找到了Body标签,但是我如何超越这个标签呢?更具体地说,我想到达<TABLE>标记。
发布于 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字典:
ns = { "u2": "URL2" }
tables = root.findall(".//u2:TABLE", ns)发布于 2018-01-21 21:46:42
您需要完全限定的名称,因为它是soap:Body,所以需要用xmlns:soap值限定主体,这个值(从信封示例中得到)是:
print(root.find("./{http://schemas.xmlsoap.org/soap/envelope/}Body"))https://stackoverflow.com/questions/48371969
复制相似问题