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

Python 按名称而不是索引查找xml节点,python,xml,dom,minidom,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].childNode

如何通过名称查找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>
更新2

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.toxml()
u'\n\n 0\n aaa\n bbb\n ccc\n'
但我如何获得价值呢?我试过这个:

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>'
dom.getElementsByTagName(“ns0:OAuthToken”)
[]
(Pdb)dom.getElementsByTagName(“ns0:OAuthToken”)[0]
(Pdb)dom.getElementsByTagName(“ns0:OAuthToken”)[0].nodeValue
(Pdb)dom.getElementsByTagName(“ns0:OAuthToken”)[0].toxml()
“AAAAA”
通常使用
lxml
和xpath是Python中的常用方法

当您想要显式地使用
minidom
时,您可以使用以下方法来获取特定标记的所有HTML元素

matches = dom.getElementsByTagName("foo")
for e in matches:
    print(e.firstChild.nodeValue)
通常使用
lxml
和xpath是Python中的常用方法

当您想要显式地使用
minidom
时,您可以使用以下方法来获取特定标记的所有HTML元素

matches = dom.getElementsByTagName("foo")
for e in matches:
    print(e.firstChild.nodeValue)
通常使用
lxml
和xpath是Python中的常用方法

当您想要显式地使用
minidom
时,您可以使用以下方法来获取特定标记的所有HTML元素

matches = dom.getElementsByTagName("foo")
for e in matches:
    print(e.firstChild.nodeValue)
通常使用
lxml
和xpath是Python中的常用方法

当您想要显式地使用
minidom
时,您可以使用以下方法来获取特定标记的所有HTML元素

matches = dom.getElementsByTagName("foo")
for e in matches:
    print(e.firstChild.nodeValue)
您需要使用,因为您没有名为
ServerTime
的标记,您有一个名为
{http://ccc.aaa.bbb/api/v1}ServerTime
(其中
{http://ccc.aaa.bbb/api/v1}
指示默认名称空间。)

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

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

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

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

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

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

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

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

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

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

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




通常xpath是非常标准的方法。您是否明确想要
minidom
?或者您可以使用
lxml
?看起来您使用的是elementtree——难道您不能使用
root.find(tagname)
?@stanleyxu2005,minidom。通常xpath是非常标准的方法。您是否明确想要
minidom
?或者您可以使用
lxml
?看起来您使用的是elementtree——难道您不能使用
root.find(tagname)
?@stanleyxu2005,minidom。通常xpath是非常标准的方法。您是否明确想要
minidom
?或者您可以使用
lxml
?看起来您使用的是elementtree——难道您不能使用
root.find(tagname)
?@stanleyxu2005,minidom。通常xpath是非常标准的方法。您是否明确想要
minidom
?或者您可以使用
lxml
?它看起来像是在使用elementtree--您不能只使用
root.find(标记名)
?@stanleyxu2005,minidom.实际上,dom.getElementsByTagName(“my_标记”)总是返回[]出于某些原因。@AlexanderSupertramp最好将您的xml内容粘贴到您的问题中。@AlexanderSupertramp我可以得到预期的“aaa”结果。实际上,dom.getElementsByTagName(“my_标记”)总是返回[]出于某些原因。@AlexanderSupertramp最好将您的xml内容粘贴到您的问题中。@AlexanderSupertramp我可以得到预期的“aaa”结果。实际上,dom.getElementsByTagName(“my_标记”)总是返回[]出于某些原因。@AlexanderSupertramp最好将您的xml内容粘贴到您的问题中。@AlexanderSupertramp我可以得到预期的“aaa”结果。实际上,dom.getElementsByTagName(“my_标记”)总是返回[]出于某些原因。@AlexanderSupertramp最好将您的xml内容粘贴到您的问题中。@AlexanderSupertramp我可以得到预期的“aaa”结果。我可以确认它在没有名称空间的情况下也可以工作。这可能取决于您的Python/lxml/ET/minidom版本,因为它在没有名称空间的情况下对我不起作用。如果不使用
dom.getElementsByTagnames()
,我会得到一个空列表,就像OP一样。请参见示例。感谢您的回复。很高兴知道。我可以确认它在没有名称空间的情况下也可以工作。这可能取决于您的Python/lxml/ET/minidom版本,因为它在没有名称空间的情况下无法工作。如果不使用
dom.getElementsByTagnames()
,我会得到一个空列表,就像OP一样。请参见示例。感谢您的回复。很高兴知道。我可以确认它在没有名称空间的情况下也可以工作。这可能取决于您的Python/lxml/ET/minidom版本,因为它在没有名称空间的情况下无法工作。如果不使用
dom.getElementsByTagnames()
,我会得到一个空列表,就像OP一样。请参见示例。感谢您的回复。很高兴知道。我可以确认它在没有名称空间的情况下也可以工作。这可能取决于您的Python/lxml/ET/minidom版本,因为它在没有名称空间的情况下无法工作。不使用
dom.getEle