如何使用Python根据其兄弟标签文本值修改xml中的标签文本值?

2024-09-28 22:25:34 发布

您现在位置:Python中文网/ 问答频道 /正文

例如:

<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>

上面给出的是从Jenkins服务器获取的XML文件的一小部分。我需要根据参数各自的名称(name和branch)修改参数的默认值(abc和true用于上面的eg)。你知道吗

我已经读过MiniDom、Element和ElementTree,但是没有弄清楚确切的api。有人能帮我解决这个问题吗。提前谢谢。你知道吗


Tags: name服务器branchtrue参数modeldescriptionxml
2条回答

我会介绍元素树和迷你们。我不熟悉元素。你知道吗

对于这些例子,我们让

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>
""""

我将通过将第一个abc默认值更改为name元素的值来演示api。你可以修改这些来适应你所需要的改变。你知道吗

对于ElementTree,我们有

import xml.etree.ElementTree as ET
root = ET.fromstring(raw)
node = root.find(".//hudson.model.StringParameterDefinition")
node.find(".//defaultValue").text = node.find(".//name").text

MiniDom在这里是最难使用的,因为它没有理解xpath的优势。然而,同样地,对于上述raw的值

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)

要循环所有xParameterDefinition元素,请在ElementTree中使用

for x in ET.findall("./*"):
    # first time will be hudson.model.StringParameterDefinition
    # second time will be hudson.model.BooleanParameterDefinition
    # put loop body here

在Minidom中,使用

for x in root.childNodes[0].childNodes:
    if isinstance(x,MD.Element): # do this to avoid text nodes (ie newlines)
        # put loop body here

最后,要将文档转换回字符串,请执行以下操作:

ET.tostring(root) # ElementTree
root.toxml() # minidom

最简单的尝试可能是使用lxml.etree并通过xpath(即这里的//hudson.model.StringParameterDefinition/defaultValue)抓取节点,如下所示进行更改并正确更改-

from lxml import etree as et

data = """<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>"""

tree = et.fromstring(data)
w = tree.xpath("//hudson.model.StringParameterDefinition/defaultValue")
w[0].text = "changed"# here w is a list
print et.tostring(tree,pretty_print=True)

输出-

<parameterDefinitions>
        <hudson.model.StringParameterDefinition>
          <name>name</name>
          <description/>
          <defaultValue>changed</defaultValue>
        </hudson.model.StringParameterDefinition>
        <hudson.model.BooleanParameterDefinition>
          <name>branch</name>
          <description/>
          <defaultValue>true</defaultValue>
        </hudson.model.BooleanParameterDefinition>
</parameterDefinitions>

相关问题 更多 >