![向标记名添加数字后缀以区分 XML 元素](https://linux22.com/image/121415/%E5%90%91%E6%A0%87%E8%AE%B0%E5%90%8D%E6%B7%BB%E5%8A%A0%E6%95%B0%E5%AD%97%E5%90%8E%E7%BC%80%E4%BB%A5%E5%8C%BA%E5%88%86%20XML%20%E5%85%83%E7%B4%A0.png)
我有一个包含多个子元素的 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
, Name2
,Name3
以便当我将它们导入 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