<p>我会介绍元素树和迷你们。我不熟悉<em>元素</em>。你知道吗</p>
<p>对于这些例子,我们让</p>
<pre><code>raw = """
<parameterDefinitions>
<hudson.model.StringParameterDefinition>
<name>name</name>
<description></description>
<defaultValue>abc</defaultValue>
</hudson.model.StringParameterDefinition>
<hudson.model.BooleanParameterDefinition>
<name>branch</name>
<description></description>
<defaultValue>true</defaultValue>
</hudson.model.BooleanParameterDefinition>
</parameterDefinitions>
""""
</code></pre>
<p>我将通过将第一个<em>abc</em>默认值更改为name元素的值来演示api。你可以修改这些来适应你所需要的改变。你知道吗</p>
<p>对于ElementTree,我们有</p>
<pre><code>import xml.etree.ElementTree as ET
root = ET.fromstring(raw)
node = root.find(".//hudson.model.StringParameterDefinition")
node.find(".//defaultValue").text = node.find(".//name").text
</code></pre>
<p>MiniDom在这里是最难使用的,因为它没有理解xpath的优势。然而,同样地,对于上述<em>raw</em>的值</p>
<pre><code>import xml.dom.minidom as MD
root = MD.parseString(raw)
node = root.childNodes[0].getElementsByTagName("hudson.model.StringParameterDefinition")[0]
defaultValue = node.getElementsByTagName("defaultValue")[0]
defaultValue.childNodes[0].replaceWholeText(node.getElementsByTagName("name")[0].childNodes[0].nodeValue)
</code></pre>
<p>要循环所有xParameterDefinition元素,请在ElementTree中使用</p>
<pre><code>for x in ET.findall("./*"):
# first time will be hudson.model.StringParameterDefinition
# second time will be hudson.model.BooleanParameterDefinition
# put loop body here
</code></pre>
<p>在Minidom中,使用</p>
<pre><code>for x in root.childNodes[0].childNodes:
if isinstance(x,MD.Element): # do this to avoid text nodes (ie newlines)
# put loop body here
</code></pre>
<p>最后,要将文档转换回字符串,请执行以下操作:</p>
<pre><code>ET.tostring(root) # ElementTree
root.toxml() # minidom
</code></pre>