<p>使用您发布的XML,您可以使用一个XPath找到所有值:</p>
<pre><code>import lxml.etree as ET
tree = ET.parse('data')
tree.xpath('//Schedule')
values = tree.xpath('//Schedule/@value1 | //Schedule/ScheduleEvent/Program/@value2')
for vals in zip(*[iter(values)]*3):
print(vals)
</code></pre>
<p>印刷品</p>
^{pr2}$
<p>此XPath假定始终有一个<code>value1</code>属性,后跟两个<code>value2</code>属性。如果你不想依赖这个假设,那么你可以这样循环:</p>
<pre><code>for schedule in tree.xpath('//Schedule[@value1]'):
value1 = schedule.get('value1')
print(value1)
for value2 in schedule.xpath('ScheduleEvent/Program/@value2'):
print(value2)
</code></pre>
<hr/>
<p>在您的代码中:</p>
<pre><code>root.xpath('//xmlns:Schedule[@value1 = "value1"]/ScheduleEvent/Program', namespaces=nsmap)
</code></pre>
<p>由于<code>"value1"</code>是一个文本字符串,因此无效。您需要将其替换为变量<code>value1</code>:</p>
<pre><code>'//xmlns:Schedule[@value1 = "{v}"]/ScheduleEvent/Program'.format(v=value1)
</code></pre>
<p>虽然这样做是可行的,但是指定<code>value1</code>可能比您需要的更具体。或者,如果两个<code>Schedule</code>元素具有相同的<code>value1</code>属性,则可能不够具体。相反,您可以通过调用<code>schedule.xpath</code>找到子元素<code>Program</code>元素:</p>
<pre><code>schedule.xpath('ScheduleEvent/Program/@value2')
</code></pre>
<p>而不是从树的顶部开始使用<code>tree.xpath</code>。在</p>