<p>问题的答案就是XPath</p>
<pre><code>/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.StringParameterDefinition[name = 'project_name']/defaultValue/text()
</code></pre>
<p>它将选择作为唯一的结果</p>
^{pr2}$
<p>假设您的实际文档没有命名空间。您不需要访问父元素或同级轴。在</p>
<p>即使etree也应该支持这种XPath表达式,但它可能不支持<a href="https://stackoverflow.com/questions/35174547/access-text-of-next-sibling/35174973#comment58066853_35174547">comment by har07</a>。在</p>
<hr/>
<blockquote>
<p>I thought about this again, and I think that looping in python is the wrong approach. This should be selectable via xpath.</p>
</blockquote>
<p>是的,我同意。如果要从文档中选择单个值,请使用XPath表达式选择该值,并将其直接存储为Python字符串,而不必循环使用元素。在</p>
<hr/>
<p><strong>使用lxml的完整示例</strong></p>
<pre><code>from lxml import etree
from StringIO import StringIO
document_string = """<project>
<properties>
<hudson.model.ParametersDefinitionProperty>
<parameterDefinitions>
<hudson.model.StringParameterDefinition>
<name>customer_name</name>
<description></description>
<defaultValue>my_customer</defaultValue>
</hudson.model.StringParameterDefinition>
<hudson.model.StringParameterDefinition>
<name>project_name</name>
<description></description>
<defaultValue>*****</defaultValue>
</hudson.model.StringParameterDefinition>
</parameterDefinitions>
</hudson.model.ParametersDefinitionProperty>
</properties>
</project>"""
tree = etree.parse(StringIO(document_string))
result_list = tree.xpath("/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.StringParameterDefinition[name = 'project_name']/defaultValue/text()")
print result_list[0]
</code></pre>
<p>输出:</p>
^{pr2}$