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各要素の新しいレコードが作成されます。これは、読みやすさの点では優れていますが、名前フィールドの外に繰り返しデータがたくさんあるかどうかを確認するのは困難です。

私がやりたいことは、ラベルの名前をに変更することですName1Name2これにより、Name3ラベルをExcelにインポートすると、すべて同じ行に表示されます。これにより、元のデータを見続けることなく、私に役に立たない、または重複したエントリを含むレコードを見つけることができます。

つまり、次のような出力を生成するスクリプトやコマンドが必要です。

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

これを使ってこれを行うことはできますか?sedコマンドや他のUnixスクリプト?

ベストアンサー1

あなたが具体的に要求したので、各要素が同じ行で開いて閉じる場合は、必要な操作を実行する/スクリプトは次のsedようになります。sedbash<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

おすすめ記事