Adicionando Sufixos Numéricos a Nomes de Tags para Distinguir Elementos XML

3

Eu tenho um arquivo XML com vários elementos filho que possuem o mesmo nome de tag, ex. <Name>Luigi</Name> , <Name>Mario</Name> , <Name>Peach</Name> . Aqui está um mock-up do meu arquivo de entrada:

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

Quando eu lanço esse arquivo para o Excel para análise, ele cria um novo registro para cada elemento Name . Isso é incrível de uma perspectiva de legibilidade, mas torna difícil discernir se eu tenho muitos dados duplicados fora dos campos de nome.

O que eu quero fazer é renomear as tags para Name1 , Name2 , Name3 para que todas elas apareçam na mesma linha quando eu importá-las para o Excel. Dessa forma, poderei encontrar registros que são inúteis para mim ou que contenham duplicatas - sem precisar examinar constantemente os dados brutos.

Em outras palavras, quero um script ou comando que produza a seguinte saída:

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

É possível fazer isso com um comando sed ou outro script Unix?

    
por Jakloom 10.11.2017 / 15:45

1 resposta

3

Como você solicitou especificamente sed , aqui está um script sed / bash que deve fazer o que você deseja, desde que cada elemento <Name> seja aberto e fechado na mesma linha:

(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}><\/Name${n}>/";
    else
        echo "${line}";
    fi;
done) < names.xml

Eu testei com este arquivo de entrada:

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

E produziu a seguinte saída:

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

Dito isso, isso parece ser um bom candidato para um idioma com uma biblioteca de análise de XML. Aqui está um script Python que faz o que você quer:

#!/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])

Execute assim:

python add_suffix.py names.xml new_names.xml
    
por 10.11.2017 / 16:33

Tags