按名称而不是索引查找xml节点

时间:2014-10-23 06:59:48

标签: python xml dom minidom

如何通过名称找到xml节点并在标签之间获取其值?

我是按照以下方式做的:

from xml.dom import minidom
dom = minidom.parseString(ET.tostring(ET.fromstring(some_xml), "utf-8"))
self.a1 = dom.childNodes[0].childNodes[4].childNodes[0].nodeValue
self.a2 = dom.childNodes[0].childNodes[5].childNodes[0].nodeValue

我想使用标记的名称而不是在数组childNodes中使用其索引来实现。怎么样?

更新

<ReconnectResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ccc.aaa.bbb/api/v1"> 
  <ErrorMessage /> 
  <ErrorCode>0</ErrorCode> 
  <ServerTime>aaa</ServerTime> 
  <OAuthToken>bbb</OAuthToken> 
  <OAuthTokenSecret>ccc</OAuthTokenSecret> 
</ReconnectResponse>

和代码:

dom.getElementsByTagName("ServerTime") # => []

UPDATE2

dom.toxml()
u'<?xml version="1.0" ?><ns0:ReconnectResponse xmlns:ns0="http://ccc.aaa.bbb/api/v1">\n  <ns0:ErrorMessage/>\n  <ns0:ErrorCode>0</ns0:ErrorCode>\n  <ns0:ServerTime>aaa</ns0:ServerTime>\n  <ns0:OAuthToken>bbb</ns0:OAuthToken>\n  <ns0:OAuthTokenSecret>ccc</ns0:OAuthTokenSecret>\n</ns0:ReconnectResponse>'

但我如何获得价值?我试过这个:

dom.getElementsByTagName("ns0:OAuthToken")
[<DOM Element: ns0:OAuthToken at 0x10635a878>]
(Pdb) dom.getElementsByTagName("ns0:OAuthToken")[0]
<DOM Element: ns0:OAuthToken at 0x10635a878>
(Pdb) dom.getElementsByTagName("ns0:OAuthToken")[0].nodeValue
(Pdb) dom.getElementsByTagName("ns0:OAuthToken")[0].toxml()
u'<ns0:OAuthToken>aaaaaa</ns0:OAuthToken>'

2 个答案:

答案 0 :(得分:2)

您需要使用getElementsByTagNameNS,因为您没有名为ServerTime的标记,您有一个名为{http://ccc.aaa.bbb/api/v1}ServerTime的标记(其中{http://ccc.aaa.bbb/api/v1}表示默认名称空间。)

getElementsByTagNameNS("http://ccc.aaa.bbb/api/v1", "ServerTime")

由于文档元素的最后一个属性,此命名空间隐式添加到XML正文中的每个标记:

<ReconnectResponse ... xmlns="http://ccc.aaa.bbb/api/v1">

答案 1 :(得分:1)

  

通常使用lxml和xpath是Python中的常用方法。

如果您想明确使用minidom,可以使用以下方法获取特定标记的所有HTML元素。

matches = dom.getElementsByTagName("foo")
for e in matches:
    print(e.firstChild.nodeValue)