Terkait: Bagaimana saya bisa cukup mencetak JSON dalam skrip shell (unix)?
Apakah ada skrip shell (unix) untuk memformat XML dalam bentuk yang dapat dibaca manusia?
Pada dasarnya, saya ingin mengubah yang berikut:
<root><foo a="b">lorem</foo><bar value="ipsum" /></root>
... menjadi sesuatu seperti ini:
<root>
<foo a="b">lorem</foo>
<bar value="ipsum" />
</root>
xml
unix
command-line
svidgen
sumber
sumber
xmllint
tersedia di sistem Debian, Anda perlu menginstal paketlibxml2-utils
(libxml2
tidak menyediakan alat ini, setidaknya tidak pada Debian 5.0 "Lenny" dan 6.0 "Squeeze").Jawaban:
libxml2-utils
Utilitas ini dilengkapi dengan
libxml2-utils
:Perl
XML::Twig
Perintah ini dilengkapi dengan XML :: Twig perlmodul, terkadang
xml-twig-tools
paket:xmlstarlet
Perintah ini dilengkapi dengan
xmlstarlet
:tidy
Periksa
tidy
paket:Python
Python
xml.dom.minidom
dapat memformat XML (baik python2 dan python3):saxon-lint
Anda membutuhkan
saxon-lint
:saxon-HE
Anda membutuhkan
saxon-HE
:sumber
echo '<xml .. />' | xmllint --some-read-from-stdn-option
?libxml2-utils
di ubuntu saya yang cantik.UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 805: ordinal not in range(128)
dalam versi python, Anda ingin mendefinisikanPYTHONIOENCODING="UTF-8"
:cat some.xml | PYTHONIOENCODING="UTF-8" python -c 'import sys;import xml.dom.minidom;s=sys.stdin.read();print xml.dom.minidom.parseString(s).toprettyxml()' > pretty.xml
echo '<x></x><y></y>' | tidy -xml -iq
xmllint --format yourxmlfile.xml
xmllint adalah alat XML baris perintah dan termasuk dalam
libxml2
( http://xmlsoft.org/ ).==============================================
Catatan: Jika Anda belum
libxml2
menginstal Anda dapat menginstalnya dengan melakukan hal berikut:CentOS
Ubuntu
sudo apt-get install libxml2-utils
Cygwin
apt-cyg install libxml2
MacOS
Untuk menginstal ini pada MacOS dengan Homebrew cukup lakukan:
brew install libxml2
Git
Juga tersedia di Git jika Anda menginginkan kode:
git clone git://git.gnome.org/libxml2
sumber
sudo apt-get install libxml2-utils
git
untuk pengunduhan Windows bahkan menginstal versi terbaru darixmllint
. Contoh:"C:\Program Files\Git\usr\bin\xmllint.exe" --format [email protected] > [email protected]
Anda juga dapat menggunakan rapi , yang mungkin perlu diinstal terlebih dahulu (misalnya di Ubuntu: sudo
apt-get install tidy
).Untuk ini, Anda akan mengeluarkan sesuatu seperti berikut:
Catatan: memiliki banyak tanda pembacaan tambahan, tetapi perilaku bungkus kata agak mengganggu untuk diatasi ( http://tidy.sourceforge.net/docs/quickref.html ).
sumber
tidy
bekerja dengan baik untuk saya juga. Tidak sepertihxnormalize
ini, tindakan ini benar-benar menutup<body>
tag.tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes < InFile.xml > OutFile.xml
.alias prettyxml='tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes | pygmentize -l xml'
dan kemudiancurl url | prettyxml
Anda tidak menyebutkan file, jadi saya berasumsi Anda ingin memberikan string XML sebagai input standar pada baris perintah. Dalam hal ini, lakukan hal berikut:
sumber
Tanpa menginstal apa pun di macOS / kebanyakan Unix.
Menggunakan
tidy
cat filename.xml | tidy -xml -iq
Mengarahkan melihat file dengan cat untuk merapikan menentukan jenis file xml dan untuk indent sementara output diam akan menekan output kesalahan. JSON juga bekerja dengan
-json
.sumber
cat
langkah:tidy -xml -iq filename.xml
. Juga, Anda bahkan dapattidy -xml -iq filename.xml
menggunakan-m
opsi untuk memodifikasi file asli ...xmllint mendukung pemformatan di tempat :
Seperti yang ditulis Daniel Veillard:
Level indent dikendalikan oleh
XMLLINT_INDENT
variabel lingkungan yang secara default 2 spasi. Contoh cara mengubah indentasi ke 4 spasi:Anda mungkin memiliki kekurangan dengan
--recover
opsi ketika dokumen XML Anda rusak. Atau coba parser HTML yang lemah dengan output XML yang ketat:--nsclean
,--nonet
,--nocdata
,--noblanks
Dll mungkin berguna. Baca halaman manual.sumber
Ini memakan waktu lama untuk menemukan sesuatu yang berfungsi pada mac saya. Inilah yang bekerja untuk saya:
sumber
Saya ingin menambahkan solusi Bash murni, karena tidak 'sulit' untuk melakukannya dengan tangan saja, dan kadang-kadang Anda tidak ingin menginstal alat tambahan untuk melakukan pekerjaan itu.
Tempel di file skrip, dan pipa di xml. Ini mengasumsikan xml semuanya dalam satu baris, dan tidak ada spasi tambahan di mana pun. Orang bisa dengan mudah menambahkan beberapa tambahan
\s*
ke regex untuk memperbaikinya.sumber