<p><code>findall()</code>不支持XPath表达式,只支持<em>ElementPath</em>(请参见<a href="http://effbot.org/zone/element-xpath.htm" rel="nofollow noreferrer">http://effbot.org/zone/element-xpath.htm</a>)。ElementPath不支持搜索包含特定字符串的元素。</p>
<p>为什么不使用XPath呢?假设文件<code>test.xml</code>包含示例XML,则以下操作有效:</p>
<pre><code>> python
Python 2.7.9 (default, Jun 29 2016, 13:08:31)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from lxml import etree
>>> tree=etree.parse("test.xml")
>>> tree.xpath("Confirmation[starts-with(TransactionId, 'GTEREVIEW')]")
[<Element Confirmation at 0x7f68b16c3c20>]
</code></pre>
<p>如果坚持使用<code>findall()</code>,那么最好的方法是获取具有<code>TransactionId</code>子节点的所有<code>Confirmation</code>元素的列表:</p>
<pre><code>>>> tree.findall("Confirmation[TransactionId]")
[<Element Confirmation at 0x7f68b16c3c20>, <Element Confirmation at 0x7f68b16c3ea8>]
</code></pre>
<p>然后需要手动筛选此列表,例如:</p>
<pre><code>>>> [e for e in tree.findall("Confirmation[TransactionId]")
if e[0].text.startswith('GTEREVIEW')]
[<Element Confirmation at 0x7f68b16c3c20>]
</code></pre>
<p>如果您的文档包含名称空间,那么如果元素使用默认名称空间(我使用<code>xmlns="file:xyz"</code>作为默认名称空间),则下面将为您获取具有<code>Confirmation</code>子节点的所有<code>TransactionId</code>元素:</p>
<pre><code>>>> tree.findall("//{{{0}}}Confirmation[{{{0}}}TransactionId]".format(tree.getroot().nsmap[None]))
[<Element {file:xyz}Confirmation at 0x7f534a85d1b8>, <Element {file:xyz}Confirmation at 0x7f534a85d128>]
</code></pre>
<p>当然还有<code>etree.ETXPath</code>:</p>
<pre><code>>>> find=etree.ETXPath("//{{{0}}}Confirmation[starts-with({{{0}}}TransactionId, 'GTEREVIEW')]".format(tree.getroot().nsmap[None]))
>>> find(tree)
[<Element {file:xyz}Confirmation at 0x7f534a85d1b8>]
</code></pre>
<p>这允许您组合XPath和名称空间。</p>