【问题标题】:Append text to xml tag value将文本附加到 xml 标记值
【发布时间】:2018-12-20 20:37:22
【问题描述】:

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

你能帮我实现这个目标吗?

【问题讨论】:

标签: python xml sed


【解决方案1】:

这是你想要做的吗?

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

【讨论】:

  • 它部分工作,但我发布了代码的较短版本,我的错。 INCOND 标记中有两个值,使用下面给出的 expr: 如何将 '-DR' 附加到 NAME 值?
【解决方案2】:

由于您的问题已标记为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多