如何使用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
表示文档中任何位置具有该名称的所有元素。一个斜杠意味着只有直系子代