GNU/Linux >> Belajar Linux >  >> Linux

Menambahkan Sufiks Numerik ke Nama Tag Untuk Membedakan Elemen Xml?

Saya memiliki file XML dengan beberapa elemen anak yang memiliki nama tag yang sama, mis. <Name>Luigi</Name> , <Name>Mario</Name> , <Name>Peach</Name> . Berikut ini adalah contoh tampilan file input saya:

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

Ketika saya membuang file ini ke Excel untuk analisis, itu membuat catatan baru untuk setiap Name elemen. Ini luar biasa dari perspektif keterbacaan, tetapi sulit untuk membedakan apakah saya memiliki banyak data duplikat di luar bidang nama.

Yang ingin saya lakukan adalah mengganti nama tag menjadi Name1 , Name2 , Name3 sehingga semuanya muncul di baris yang sama saat saya mengimpornya ke Excel. Dengan begitu saya akan dapat menemukan catatan yang tidak berguna bagi saya atau yang berisi duplikat – tanpa harus terus-menerus melihat data mentah.

Dengan kata lain, saya ingin skrip atau perintah yang menghasilkan output berikut:

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

Apakah mungkin melakukan ini dengan sed perintah atau skrip Unix lainnya?

Jawaban yang Diterima:

Karena Anda secara khusus meminta sed , ini adalah sed /bash skrip yang harus melakukan apa yang Anda inginkan, asalkan setiap <Name> elemen dibuka dan ditutup pada baris yang sama:

(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

Saya mengujinya dengan file input ini:

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

Dan itu menghasilkan output berikut:

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

Yang mengatakan, ini sepertinya kandidat yang baik untuk bahasa dengan perpustakaan penguraian XML. Berikut adalah skrip Python yang melakukan apa yang Anda inginkan:

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

Jalankan seperti ini:

python add_suffix.py names.xml new_names.xml

Linux
  1. Redirection Ke Nama File Globbed Gagal?

  2. Elemen Terpisah Dari Kata Unta?

  3. Menambahkan IP ke Server Windows

  1. Server Nama Rackspace

  2. Cari Atribut XML PowerShell XPath

  3. Bagaimana memberi nama utas di Linux?

  1. Menambahkan bagian ke file ELF

  2. Ubah nama proses di Linux

  3. wget:nama file yang diunduh