GNU/Linux >> Belajar Linux >  >> Linux

Gunakan XMLStarlet untuk mengurai XML di terminal Linux

Belajar mengurai XML sering dianggap sebagai usaha yang kompleks, tetapi tidak harus demikian. XML sangat terstruktur dan ketat, sehingga relatif dapat diprediksi. Ada juga banyak alat di luar sana untuk membantu membuat pekerjaan dapat dikelola.

Salah satu utilitas XML favorit saya adalah XMLStarlet, toolkit XML untuk terminal Anda. Dengan XMLStarlet, Anda dapat memvalidasi, mengurai, mengedit, memformat, dan mengubah data XML. XMLStarlet adalah perintah yang relatif minimal, tetapi menavigasi XML penuh potensi, jadi artikel ini menunjukkan cara menggunakannya untuk kueri data XML.

Instal

XMLStarlet diinstal secara default pada CentOS, Fedora, dan banyak distribusi Linux modern lainnya, jadi cukup buka terminal dan ketik xmlstarlet untuk mengaksesnya. Jika XMLStarlet belum diinstal, sistem operasi Anda menawarkan untuk menginstalnya untuk Anda.

Sebagai alternatif, Anda dapat menginstal xmlstarlet perintah dari manajer paket Anda:

$ sudo dnf install xmlstarlet 

Lebih banyak sumber daya Linux

  • Lembar contekan perintah Linux
  • Lembar contekan perintah Linux tingkat lanjut
  • Kursus online gratis:Ikhtisar Teknis RHEL
  • Lembar contekan jaringan Linux
  • Lembar contekan SELinux
  • Lembar contekan perintah umum Linux
  • Apa itu container Linux?
  • Artikel Linux terbaru kami

Di macOS, gunakan MacPorts atau Homebrew. Di Windows, gunakan Chocolatey.

Jika semuanya gagal, Anda dapat menginstalnya secara manual dari kode sumber di Sourceforge.

Mengurai XML dengan XMLStarlet

Ada banyak alat yang dirancang untuk membantu mengurai dan mengubah data XML, termasuk pustaka perangkat lunak yang memungkinkan Anda menulis parser Anda sendiri dan perintah kompleks seperti fop dan xsltproc . Terkadang Anda tidak perlu memproses data XML; Anda hanya perlu cara mudah untuk mengekstrak data penting dari, memperbarui, atau hanya memvalidasinya. Untuk interaksi XML spontan, saya menggunakan xmlstarlet , aplikasi bergaya "pisau Tentara Swiss" klasik yang melakukan tugas XML paling umum. Anda dapat melihat apa yang ditawarkannya dengan menjalankan perintah bersama dengan --help pilihan:

$ xmlstarlet --help
Penggunaan:xmlstarlet [] []
di mana adalah salah satu dari:
  ed    (atau edit )      - Edit/Perbarui dokumen XML
  sel   (atau pilih)    - Pilih data atau kueri dokumen XML (XPATH, dll)
  tr    (atau transformasi) - Transformasi dokumen XML menggunakan XSLT
  val   (atau validasi)  - Validasi dokumen XML (well-formed/DTD/XSD/RelaxNG)
  untuk    (atau format)    - Format dokumen XML
  el (atau elemen)  - Menampilkan struktur elemen dokumen XML
  c14n  (atau kanonik)   - Kanonikalisasi XML
  ls    (atau daftar)      - Daftar direktori sebagai XML
[...]

Anda bisa mendapatkan bantuan lebih lanjut dengan menambahkan --help ke akhir salah satu subperintah berikut:

$ xmlstarlet sel --help
  -Q or --quiet             - jangan menulis apa pun ke output standar.
  -C atau --comp              - menampilkan XSLT yang dihasilkan
  -R atau - -root              - print root element
  -T atau --text              - output adalah teks (default adalah XML)
  -I atau --indent            - indent output
[.. .]

Memilih data dengan sel

Anda dapat melihat data dalam XML dengan xmlstarlet select (sel singkatnya) perintah. Berikut adalah dokumen XML sederhana:



 
   

      Fedora
      7
      Moonshine
     
Langsung
        Fedora
        Semuanya
     

   

   
      Fedora Core
      6
      Zod

   
   

 
   

Saat mencari data dalam file XML, tugas pertama Anda adalah fokus pada node yang ingin Anda jelajahi. Jika Anda mengetahui jalur ke simpul, tentukan jalur lengkapnya dengan --value-of pilihan. Semakin awal pohon Document Object Model (DOM) Anda mulai menjelajah, semakin banyak informasi yang Anda lihat:

$ xmlstarlet pilih --template \
--value-of /xml/os/linux/distribution \
--nl myfile.xml
      Fedora
      7
      Moonshine
     
        Live
        Fedora
        Semuanya     
     
      Fedora Core
       

--nl singkatan dari "baris baru", dan itu menyisipkan banyak spasi untuk memastikan terminal prompt Anda mendapatkan baris baru setelah hasil Anda masuk. Saya telah menghapus beberapa ruang berlebih dalam output sampel.

Persempit fokus Anda dengan turun lebih jauh ke dalam pohon DOM:

$ xmlstarlet pilih --template \
--value-of /xml/os/linux/distribution/name \
--nl myfile.xml
Fedora
Fedora Inti

Pilihan bersyarat

Salah satu alat yang paling kuat untuk navigasi dan parsing XML disebut XPath. Ini mengatur sintaks yang digunakan dalam pencarian XML dan memanggil fungsi dari pustaka XML. XMLStarlet memahami ekspresi XPath, sehingga Anda dapat membuat pilihan Anda bersyarat dengan fungsi XPath. XPath memiliki banyak fungsi, dan didokumentasikan secara rinci oleh W3C, tetapi menurut saya dokumentasi XPath Mozilla lebih ringkas.

Anda dapat menggunakan tanda kurung siku sebagai fungsi pengujian, membandingkan konten elemen dengan beberapa nilai. Berikut adalah tes untuk nilai <name> elemen, yang mengembalikan nomor rilis yang hanya terkait dengan kecocokan tertentu.

Bayangkan sejenak bahwa contoh file XML berisi semua rilis Fedora yang dimulai dengan 1. Untuk melihat semua nomor rilis yang terkait dengan nama lama "Fedora Core" (proyek menghapus "Core" dari nama sejak rilis 7 dan seterusnya):

$ xmlstarlet sel --template \
--value-of '/xml/os/linux/distribution[name ="Fedora Core"]/release' \
--nl myfile.xml
6
5
4
3
2
1

Anda juga dapat melihat semua nama kode untuk rilis tersebut, dengan mengubah --value-of jalur ke /xml/os/linux/distribution[name = "Fedora Core"]/codename .

Mencocokkan jalur dan mendapatkan nilai

Keuntungan melihat tag XML sebagai node adalah setelah Anda menemukan node, Anda dapat menganggapnya sebagai "direktori" data Anda saat ini. Ini sebenarnya bukan direktori, setidaknya tidak dalam arti sistem file, tetapi ini adalah kumpulan data yang dapat Anda kueri. Untuk membantu Anda menjaga tujuan Anda dan data "di dalamnya" terpisah, XMLStarlet membedakan antara apa yang Anda coba cocokkan dengan --match opsi dan nilai data yang Anda inginkan dengan --value-of pilihan.

Misalkan Anda tahu bahwa <spin> simpul berisi beberapa elemen. Itu menjadikannya tujuan Anda. Setelah Anda berada di sana, Anda dapat menggunakan --value-of untuk menentukan elemen mana yang Anda inginkan nilainya. Untuk melihat semua elemen, gunakan titik (. ) untuk mewakili lokasi Anda saat ini:

$ xmlstarlet sel --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '.' --nl myfile.xml \
Langsung
Fedora
Semuanya

Seperti halnya menavigasi DOM, Anda dapat menggunakan ekspresi XPath untuk membatasi cakupan data yang dikembalikan. Dalam contoh ini, saya menggunakan last() berfungsi untuk mengambil hanya elemen terakhir dalam spin simpul:

$ xmlstarlet pilih --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '*[last()]' --nl myfile.xml
Semuanya

Dalam contoh ini, saya menggunakan position() fungsi untuk memilih elemen tertentu dalam spin simpul:

$ xmlstarlet pilih --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '*[position() =2]' - -nl myfile.xml
Fedora

--match dan --value-of opsi dapat tumpang tindih, jadi terserah Anda bagaimana Anda ingin menggunakannya bersama-sama. Kedua ekspresi ini, dalam kasus contoh XML, melakukan hal yang sama:

$ xmlstarlet pilih  --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '.' \
--nl myfile.xml
Langsung
Fedora
Semuanya     

$ xmlstarlet pilih --template \
--match '/ xml/os/linux/distribution' \
--value-of 'spin' \
--nl myfile.xml
Langsung
Fedora
Semuanya

Menjadi nyaman dengan XML

XML terkadang terlihat berlebihan dan berat, tetapi alat yang dibuat untuk berinteraksi dengannya secara konsisten mengejutkan saya. Jika Anda ingin memanfaatkan XML, maka XMLStarlet bisa menjadi titik masuk yang baik. Lain kali Anda akan membuka file XML untuk melihat data terstruktur, coba gunakan XMLStarlet dan lihat apakah Anda dapat membuat kueri data tersebut. Semakin nyaman Anda menggunakan XML, semakin baik XML melayani Anda sebagai format data yang kuat dan fleksibel.


Linux
  1. Salin file di terminal Linux

  2. Ganti nama file di terminal Linux

  3. Pindahkan file di terminal Linux

  1. Gunakan terminal Linux untuk menavigasi seluruh komputer Anda

  2. Gunakan terminal Linux untuk melihat file apa yang ada di komputer Anda

  3. Cara menggunakan perintah grep Linux

  1. Cara menggunakan perintah history di Linux

  2. Dengarkan radio di terminal Linux

  3. Perintah terminal Linux mana yang paling sering Anda gunakan?