<p>您问题中的XML不可能被解析——我假设与@Bruno显示的XML相同。下次在这里发布问题时,请确保问题中的数据(和代码)有效</p>
<p>Minidom可能是解决眼前问题的一种方法,但一般来说,我认为ElementTree具有更好的xml支持,尽管如果您需要更复杂的xpath,那么lxml或其他库会更好</p>
<p>无论如何,要解决您的特定问题,xpath不起作用的第一个原因是因为xml使用名称空间</p>
<p>特别是对于xml,这一行指定下面的标记位于命名空间<a href="http://EMVS.EU/Common/20181/" rel="nofollow noreferrer">http://EMVS.EU/Common/20181/</a></p>
<pre><code><SupportingData xmlns="http://EMVS.EU/Common/20181/">
</code></pre>
<p>xpath无法工作的第二个原因是<code>Item key/errorcode[@value=]</code>的xpath语法不正确-这应该是<code>Item[@key='errorcode']</code>,但名称空间问题意味着您尚未达到匹配失败或可能导致异常的程度</p>
<p>因此,xpath需要在{}中包含用于标记的名称空间,否则它将不匹配。这项工作:</p>
<pre><code>for elm in root.findall("./{http://EMVS.EU/Common/20181/}SupportingData/{http://EMVS.EU/Common/20181/}Item[@key='errorcode']"):
print(elm)
print(elm.attrib)
</code></pre>
<p>使用名称空间时,很难使xpath字符串正常工作。当您开始尝试匹配一长串标记/属性时,您不知道哪一位不匹配。我的方法非常简单:从匹配第一个xpath部分开始,即:</p>
<pre><code>for elm in root.findall("./{http://EMVS.EU/Common/20181/}SupportingData"):
</code></pre>
<p>检查是否有效-在第一个xpath有效之前,没有必要添加更多内容,然后添加下一个匹配项,检查是否有效,添加下一个匹配项,等等。这样,当xpath不匹配时,就是您刚才添加的部分,这就是问题所在</p>
<p>还有其他匹配名称空间的方法,例如提供名称空间字典并使用类似<code>findall('role:character', ns)</code>的名称空间-ElementTree文档中有一些示例<a href="https://python.readthedocs.io/en/stable/library/xml.etree.elementtree.html" rel="nofollow noreferrer">https://python.readthedocs.io/en/stable/library/xml.etree.elementtree.html</a></p>
<p>如果您不打算写出XML,并且在多个名称空间中没有使用标记,那么另一种非常方便的方法是简单地将所有名称空间从标记中剥离,也可能从属性中剥离。请参见@nonagon和我在这里的例子<a href="https://stackoverflow.com/questions/13412496/python-elementtree-module-how-to-ignore-the-namespace-of-xml-files-to-locate-ma/33997423#33997423">Python ElementTree module: How to ignore the namespace of XML files to locate matching element when using the method "find", "findall"</a></p>