Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python根据xml中的同级标记文本值修改标记文本值?_Python_Xml_Jenkins - Fatal编程技术网

如何使用python根据xml中的同级标记文本值修改标记文本值?

如何使用python根据xml中的同级标记文本值修改标记文本值?,python,xml,jenkins,Python,Xml,Jenkins,例如: <parameterDefinitions> <hudson.model.StringParameterDefinition> <name>name</name> <description></description> <defaultValue>abc</defaultValue> </huds

例如:

<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
分支
真的
上面给出的是我从Jenkins服务器获取的XML文件的一小部分。我需要根据参数各自的名称(名称和分支)修改参数的默认值(abc和true,用于上面的eg)


已经阅读了MiniDom、Element和ElementTree,但无法理解确切的api。有人能帮我解决这个问题吗。提前感谢。

最简单的尝试可能是使用
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)
从lxml导入etree作为et
data=”“”
名称
abc
分支
真的
"""
tree=et.fromstring(数据)
w=tree.xpath(“//hudson.model.StringParameterDefinition/defaultValue”)
w[0].text=“changed”#这里w是一个列表
print et.tostring(tree,pretty\u 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>

名称
改变
分支
真的

最简单的尝试可能是使用
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)
从lxml导入etree作为et
data=”“”
名称
abc
分支
真的
"""
tree=et.fromstring(数据)
w=tree.xpath(“//hudson.model.StringParameterDefinition/defaultValue”)
w[0].text=“changed”#这里w是一个列表
print et.tostring(tree,pretty\u 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>

名称
改变
分支
真的

我将介绍ElementTree和Minidom。我不熟悉这个元素

对于这些示例,我们让

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>
""""
MiniDom在这里最难使用,因为它没有理解xpath的优势。然而,同样地,使用上述原始值

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

我将介绍ElementTree和Minidom。我不熟悉这个元素

对于这些示例,我们让

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>
""""
MiniDom在这里最难使用,因为它没有理解xpath的优势。然而,同样地,使用上述原始值

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

我需要根据名称标记值(而不是名称标记值本身)更改默认值,即在.conf文件中检查与名称标记对应的值,然后将其复制到此处。我需要为parameter Definitions标签中指定的每个参数循环它。使用u提供的API,我能够找到它,但是'node.find(“.//defaultValue”).text=node.find(“.//name”).text'将反映原始变量中修改的内容o,raw只是一个字符串。要将新xml作为字符串获取,请在ET中使用
ET.tostring(root)
,在minidom中使用
root.toxml()
。并将赋值更改为您需要的值;我只是复制了这些值作为示例,正如您所说,您需要它们依赖于名称,但没有告诉我们它们如何依赖于名称。我只提供了两个参数作为示例(hudson.model.StringParameterDefinition和hudson.model.StringParameterDefinition),但会有很多这样的参数。find()每次只能找到一个参数。我怎样才能使它对里面的所有参数进行循环呢?这是一个xpath表达式。句点表示“此节点”,而“/”表示其下的所有内容,无论其深度如何。因此,
//hudson.model.StringParameterDefinition
表示文档中任何位置具有该名称的所有元素。一个斜杠意味着只有直系子代(在这种情况下会起作用)。是一种用于定位xml文件部分的语言,如果您经常使用xml,它是一种必备的语言。请注意,ET示例与MD示例相比有多好,这是因为我们让xpath引擎完成所有工作。我需要根据名称标记值(而不是名称标记值本身)更改默认值,即在.conf文件中检查与名称标记对应的值,然后将其复制到此处。我需要为parameter Definitions标签中指定的每个参数循环它。使用u提供的API,我能够找到它,但是'node.find(“.//defaultValue”).text=node.find(“.//name”).text'将反映原始变量中修改的内容o,raw只是一个字符串。要将新xml作为字符串获取,请在ET中使用
ET.tostring(root)
,在minidom中使用
root.toxml()
。并将赋值更改为您需要的值;我只是复制了这些值作为示例,正如您所说,您需要它们依赖于名称,但没有告诉我们它们如何依赖于名称。我只提供了两个参数作为示例(hudson.model.StringParameterDefinition和hudson.model.StringParameterDefinition),但会有很多这样的参数。find()每次只能找到一个参数。我怎样才能使它对里面的所有参数进行循环呢?这是一个xpath表达式。句点表示“此节点”,而“/”表示其下的所有内容,无论其深度如何。因此,
//hudson.model.StringParameterDefinition
表示文档中任何位置具有该名称的所有元素。一个斜杠意味着只有直系子代