web-dev-qa-db-ja.com

コマンドラインからXMLをきれいに印刷する方法

関連: (unix)シェルスクリプトでJSONをきれいに印刷するにはどうすればよいですか。

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

基本的に、私はそれが次のように変換して欲しいです。

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

...このようなものに:

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

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'
789
Gilles Quenot

xmllint --format yourxmlfile.xml

xmllint はコマンドラインのXMLツールで、libxml2http://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

128
crmpicco

tidy を使用することもできます。これは最初にインストールする必要があるかもしれません(例:Ubuntu:Sudo apt-get install tidy)。

これには、次のようなものを発行します。

tidy -xml -i your-file.xml > output.xml

注意:読みやすさのフラグがたくさんありますが、折り返しの動作はちょっと煩わしいです( http://tidy.sourceforge.net/docs/quickref.html )。

33
matanster

あなたはファイルに言及しなかったので、私はあなたがコマンドラインの標準入力としてXML文字列を提供したいと思います。その場合は、次の手順に従ってください。

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

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
6
gavenkoa

Macには何もインストールせずに

tidyを使う

cat filename.xml | tidy -xml -iq

Xmlのファイルタイプをきちんと指定してインデントするようにcatでファイルを表示するようにリダイレクトすると、エラー出力が抑制されます。 JSONは-jsonでも動作します。

0
jasonleonhard