関連: (unix)シェルスクリプトでJSONをきれいに印刷するにはどうすればよいですか。
人間が読める形式でXMLをフォーマットするための(unix)シェルスクリプトはありますか?
基本的に、私はそれが次のように変換して欲しいです。
<root><foo a="b">lorem</foo><bar value="ipsum" /></root>
...このようなものに:
<root>
<foo a="b">lorem</foo>
<bar value="ipsum" />
</root>
libxml2-utils
このユーティリティには libxml2-utils
が付属しています。
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
xmllint --format -
PerlのXML::Twig
このコマンドには XML :: TwigPerl moduleが付属していますが、xml-twig-tools
パッケージもあります。
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
xml_pp
xmlstarlet
このコマンドには xmlstarlet
が付いています。
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
xmlstarlet format --indent-tab
tidy
tidy
パッケージを確認してください。
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
tidy -xml -i -
Python
Pythonのxml.dom.minidom
はXMLをフォーマットできます(python2とpython3の両方)。
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
python -c 'import sys;import xml.dom.minidom;s=sys.stdin.read();print(xml.dom.minidom.parseString(s).toprettyxml())'
saxon-lint
saxon-lint
:が必要です。
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
saxon-lint --indent --xpath '/' -
saxon-HE
saxon-HE
:が必要です。
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
Java -cp /usr/share/Java/saxon/saxon9he.jar net.sf.saxon.Query \
-s:- -qs:/ '!indent=yes'
xmllint --format yourxmlfile.xml
xmllint はコマンドラインのXMLツールで、libxml2
( http://xmlsoft.org/ )に含まれています。
==================================================
注:libxml2
がインストールされていない場合は、次のようにしてインストールできます。
CentOS
cd /tmp
wget ftp://xmlsoft.org/libxml2/libxml2-2.8.0.tar.gz
tar xzf libxml2-2.8.0.tar.gz
cd libxml2-2.8.0/
./configure
make
Sudo make install
cd
Ubuntu
Sudo apt-get install libxml2-utils
Cygwin
apt-cyg install libxml2
MacOS
HomebrewでこれをMacOSにインストールするには、次のようにしてください。brew install libxml2
Git
コードが必要な場合はGitでも入手できます。git clone git://git.gnome.org/libxml2
tidy を使用することもできます。これは最初にインストールする必要があるかもしれません(例:Ubuntu:Sudo apt-get install tidy
)。
これには、次のようなものを発行します。
tidy -xml -i your-file.xml > output.xml
注意:読みやすさのフラグがたくさんありますが、折り返しの動作はちょっと煩わしいです( http://tidy.sourceforge.net/docs/quickref.html )。
あなたはファイルに言及しなかったので、私はあなたがコマンドラインの標準入力としてXML文字列を提供したいと思います。その場合は、次の手順に従ってください。
$ echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | xmllint --format -
xmllintはインプレースフォーマットをサポートします :
for f in *.xml; do xmllint -o $f --format $f; done
Daniel Veillardが書いているように:
私は
xmllint -o tst.xml --format tst.xml
は安全であるべきだと思います。なぜならパーサーはそれを直列化するために出力を開く前に完全に入力を木にロードするからです。
インデントレベルはXMLLINT_INDENT
環境変数によって制御されます。これはデフォルトで2スペースです。インデントを4つのスペースに変更する方法の例
XMLLINT_INDENT=' ' xmllint -o out.xml --format in.xml
XML文書が壊れているときは--recover
オプションがないかもしれません。または厳密なXML出力を持つ弱いHTMLパーサーを試してください。
xmllint --html --xmlout <in.xml >out.xml
--nsclean
、--nonet
、--nocdata
、--noblanks
などが役に立つかもしれません。 manページを読んでください。
apt-get install libxml2-utils
apt-cyg install libxml2
brew install libxml2
tidy
を使うcat filename.xml | tidy -xml -iq
Xmlのファイルタイプをきちんと指定してインデントするようにcatでファイルを表示するようにリダイレクトすると、エラー出力が抑制されます。 JSONは-json
でも動作します。