向标记名添加数字后缀以区分 XML 元素

向标记名添加数字后缀以区分 XML 元素

我有一个包含多个子元素的 XML 文件,这些子元素具有相同的标记名称,例如。<Name>Luigi</Name>, <Name>Mario</Name>, <Name>Peach</Name>.这是我的输入文件的模型:

<!-- names.xml -->
<Names>
    <Name>Luigi</Name>
    <Name>Mario</Name>
    <Name>Peach</Name>
</Names>

当我将此文件放入 Excel 进行分析时,它会为每个Name元素创建一条新记录。从可读性的角度来看,这非常棒,但是很难辨别名称字段之外是否有大量重复数据。

我想要做的是将标签重命名为Name1, Name2Name3以便当我将它们导入 Excel 时它们都出现在同一行。这样我就能够找到对我无用或包含重复项的记录 - 而无需不断查看原始数据。

换句话说,我想要一个产生以下输出的脚本或命令:

<!-- names.xml -->
<Names>
    <Name1>Luigi</Name1>
    <Name2>Mario</Name2>
    <Name3>Peach</Name3>
</Names>

是否可以用a来做到这一点sed命令或其他 Unix 脚本?

答案1

由于您特别要求sed,这里有一个sed/bash脚本,它应该执行您想要的操作,前提是每个<Name>元素在同一行上打开和关闭:

(IFS='';
n=0;
while read line; do
    if echo "${line}" | grep -Pq "<Name>\w+</Name>"; then
        ((n++));
        echo "${line}" | sed "s/<Name>\(\w\+\)<\/Name>/<Name${n}>\1<\/Name${n}>/";
    else
        echo "${line}";
    fi;
done) < names.xml

我用这个输入文件测试了它:

<!-- names.xml -->
<Names>
    <Name>Luigi</Name>
    <Name>Mario</Name>
    <Name>Peach</Name>
</Names>

它产生了以下输出:

<Names>
    <Name1>Luigi</Name1>
    <Name2>Mario</Name2>
    <Name3>Peach</Name3>
</Names>

也就是说,这似乎是具有 XML 解析库的语言的良好候选者。这是一个可以执行您想要的操作的 Python 脚本:

#!/usr/bin/env python2
# -*- encoding: ascii -*-

# add_suffix.py

import sys
import xml.etree.ElementTree

# Load the data
tree = xml.etree.ElementTree.parse(sys.argv[1])
root = tree.getroot()

# Update the XML tree
suffix = 0
for name in root.iter("Name"):
    suffix += 1
    name.tag += str(suffix)

# Write out the updated data
tree.write(sys.argv[2])

像这样运行它:

python add_suffix.py names.xml new_names.xml

相关内容