xpath - 在使用ElementTree的XML树中,找到一个元素

  显示原文与译文双语对照的内容

我正在尝试在一个XML文件中找到一个特定的元素,使用 ElementTree 。 下面是 xml:


<documentRoot>
 <?version="1.0" encoding="UTF-8" standalone="yes"?>
 <n:CallFinished xmlns="http://api.callfire.com/data" xmlns:n="http://api.callfire.com/notification/xsd">
 <n:SubscriptionId>96763001</n:SubscriptionId>
 <Call id="158864460001">
 <FromNumber>5129618605</FromNumber>
 <ToNumber>15122537666</ToNumber>
 <State>FINISHED</State>
 <ContactId>125069153001</ContactId>
 <Inbound>true</Inbound>
 <Created>2014-01-15T00:15:05Z</Created>
 <Modified>2014-01-15T00:15:18Z</Modified>
 <FinalResult>LA</FinalResult>
 <CallRecord id="94732950001">
 <Result>LA</Result>
 <FinishTime>2014-01-15T00:15:15Z</FinishTime>
 <BilledAmount>1.0</BilledAmount>
 <AnswerTime>2014-01-15T00:15:06Z</AnswerTime>
 <Duration>9</Duration>
 </CallRecord>
 </Call>
 </n:CallFinished>
</documentRoot>

我对 <Created> 项目感兴趣。 下面是我使用的代码:


import xml.etree.ElementTree as ET

calls_root = ET.fromstring(calls_xml)
 for item in calls_root.find('CallFinished/Call/Created'):
 print"Found you!"
 call_start = item.text

我尝试了很多不同的XPath表达式,但是我遇到了麻烦- 我找不到元素。 任何提示?

时间: 作者:

你没有引用XML文档中的命名空间,所以ElementTree无法找到该XPath中的元素。 你需要告诉ElementTree你正在使用哪些名称空间。

以下各项应该适用:


import xml.etree.ElementTree as ET

namespaces = {'n':'{http://api.callfire.com/notification/xsd}',
 '_':'{http://api.callfire.com/data}'
 }
calls_root = ET.fromstring(calls_xml)
 for item in calls_root.find('{n}CallFinished/{_}Call/{_}Created'.format(**namespaces)):
 print"Found you!"
 call_start = item.text

另外,有一个围绕ElementTree的包装器,对名称空间有很好的支持,不必担心字符串格式的问题。

作者:
...