我想在xml行下面的“ INCOND”标签中的“ NAME”值的末尾添加文本。
<System>
<FOLDER FOLDER_NAME="Production" >
<JOB JOBNAME="JOB1" >
<INCOND NAME="First-Cond-PROD" ODATE="ODAT" />
</JOB>
<JOB JOBNAME="JOB1" >
<INCOND NAME="Second-Cond-PROD" ODATE="ODAT" />
</JOB>
<JOB JOBNAME="JOB1" >
<INCOND NAME="Third-Cond-PROD" ODATE="ODAT" />
</JOB>
</FOLDER>
</System>
我看过xml ed,sed示例,但这些示例有助于替换值。由于这些值在我必须修改的3K条目中不是恒定的,因此我引用的条目没有帮助。我正在查看所需的输出,如下所示:
<System>
<FOLDER FOLDER_NAME="Production" >
<JOB JOBNAME="JOB1" >
<INCOND NAME="First-Cond-PROD-DR" />
</JOB>
<JOB JOBNAME="JOB1" >
<INCOND NAME="Second-Cond-PROD-DR" />
</JOB>
<JOB JOBNAME="JOB1" >
<INCOND NAME="Third-Cond-PROD-DR" />
</JOB>
</FOLDER>
</System>
您能帮我实现这一目标吗?
答案 0 :(得分:0)
这是您要做什么吗?
$ sed 's/\(<INCOND.*\)"/\1-DR"/' file
<System>
<FOLDER FOLDER_NAME="Production" >
<JOB JOBNAME="JOB1" >
<INCOND NAME="First-Cond-PROD-DR" />
</JOB>
<JOB JOBNAME="JOB1" >
<INCOND NAME="Second-Cond-PROD-DR" />
</JOB>
<JOB JOBNAME="JOB1" >
<INCOND NAME="Third-Cond-PROD-DR" />
</JOB>
</FOLDER>
</System>
答案 1 :(得分:0)
由于您的问题被标记为python,因此可以使用lxml ...
Python 3.6
from lxml import etree
tree = etree.parse("input.xml")
for attr in tree.xpath("//INCOND/@NAME"):
attr.getparent().attrib["NAME"] = f"{attr}-DR"
print(etree.tostring(tree, encoding="unicode"))
输出
<System>
<FOLDER FOLDER_NAME="Production">
<JOB JOBNAME="JOB1">
<INCOND NAME="First-Cond-PROD-DR" ODATE="ODAT"/>
</JOB>
<JOB JOBNAME="JOB1">
<INCOND NAME="Second-Cond-PROD-DR" ODATE="ODAT"/>
</JOB>
<JOB JOBNAME="JOB1">
<INCOND NAME="Third-Cond-PROD-DR" ODATE="ODAT"/>
</JOB>
</FOLDER>
</System>
由于更好的xpath支持,我更喜欢lxml而不是ElementTree,但是ElementTree是另一个选择(与上述输出相同)...
Python 3.6
import xml.etree.ElementTree as etree
tree = etree.parse("input.xml")
for elem in tree.findall(".//INCOND[@NAME]"):
elem.set("NAME", f"{elem.get('NAME')}-DR")
print(etree.tostring(tree.getroot(), encoding="unicode"))
您还可以使用xmlstarlet(与上述输出相同)...
xmlstarlet命令行
xmlstarlet ed -u '//INCOND/@NAME' -x 'concat(.,"-DR")' input.xml