如何通过名称找到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>'
答案 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)