将文字附加到xml标记值

时间:2018-07-12 14:44:40

标签: python xml sed

我想在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>

您能帮我实现这一目标吗?

2 个答案:

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