1. ホーム
  2. xml

[解決済み] コマンドラインからXMLをきれいに印刷する方法は?

2022-03-16 04:07:52

質問

関連する (unix)シェルスクリプトでJSONをpretty-printするにはどうしたらいいですか?

人間が読める形でXMLをフォーマットする(unix)シェルスクリプトはありますか?

基本的には以下のように変換して欲しいのですが。

<root><foo a="b">lorem</foo><bar value="ipsum" /></root>

...のようなものになります。

<root>
    <foo a="b">lorem</foo>
    <bar value="ipsum" />
</root>

解決方法は?

xmllint

このユーティリティには libxml2-utils :

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xmllint --format -

Perlの XML::Twig

このコマンドには XML::Twig パール モジュール、時には 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の xml.dom.minidom はXMLをフォーマットすることができます(レガシーなpython2でも動作します)。

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'