コマンドラインからXMLをきれいに印刷する方法
1. 概要
XML は、人間が読めるマークアップ言語です。 ただし、適切にフォーマットされていないと、読みやすく、理解しにくいものになります。 たとえば、単一の長い行を含むXMLファイル、または要素のインデントのないXMLは、視覚的に理解するのが困難です。 これは、Linuxコンソールで表示する場合に特に当てはまります。
このチュートリアルでは、Linuxコマンドを使用してXMLファイルをきれいに印刷するいくつかの方法について説明します。
2. XMLの例
まず、例で使用するXMLファイルemails.xmlを見てみましょう。
<emails> <email> <from>Kai</from> <to>Amanda</to> <time>2018-03-05</time>
<subject>I am flying to you</subject></email> <email>
<from>Jerry</from> <to>Tom</to> <time>1992-08-08</time> <subject>Hey Tom, catch me if you can!</subject>
</email> </emails>
emails.xmlファイルは有効なXMLファイルです。 ただし、フォーマットが適切でないため、読んで理解するのは困難です。
このファイルを入力例として使用し、コマンドラインできれいに印刷します。
XMLファイルをフォーマットして出力する方法はたくさんあります。 このチュートリアルでは、 xmllint 、 XMLStarlet 、およびxml_pp。の3つのコマンドラインXMLユーティリティについて説明します。
それでは、emails.xmlを人間が読める形式で印刷してみましょう。
3. xmllintコマンドの使用
xmllint コマンドは、xmllib2パッケージのメンバーです。 通常、これを使用して、XMLファイルが有効かどうかを確認したり、XMLファイルを解析したり、XPath式を評価したりできます。
3.1. Pretty-XMLを印刷する
xmllintユーティリティには–formatオプションがあります。 このオプションを使用すると、XMLを再フォーマットして再インデントできます。 構文は単純です。
xmllint --format XML_FILE
xmllint コマンドを使用して、emails.xmlを再フォーマットしてみましょう。
$ xmllint --format emails.xml
出力を取得します。
<?xml version="1.0"?>
<emails>
<email>
<from>Kai</from>
<to>Amanda</to>
<time>2018-03-05</time>
<subject>I am flying to you</subject>
</email>
<email>
<from>Jerry</from>
<to>Tom</to>
<time>1992-08-08</time>
<subject>Hey Tom, catch me if you can!</subject>
</email>
</emails>
現在、XMLのデータははるかに読みやすく理解しやすいものになっています。
また、コマンドがXML宣言を追加していることもわかります —入力ファイルに含まれていなくても。
3.2. フォーマットオプション
xmllint コマンドと–format オプションを併用すると、XMLファイルを簡単に再フォーマットできます。
emails.xmlを再フォーマットして再度印刷してみましょう。 今回は、インデントとして4つのスペースを設定しましょう。
$ XMLLINT_INDENT=" " ; xmllint --format emails.xml
コマンドの出力は次のとおりです。
<?xml version="1.0"?>
<emails>
<email>
<from>Kai</from>
<to>Amanda</to>
<time>2018-03-05</time>
<subject>I am flying to you</subject>
</email>
<email>
...
</email>
</emails>
4. XMLStarletツールキットの使用
XMLStarletは、コマンドラインXMLツールキットです。 xmlと呼ばれる実行可能ファイルが1つ含まれています。このコマンドを使用して、 XMLドキュメントおよびファイルの変換、クエリ、検証、および編集を行うことができます。
xmlコマンドを使用するための構文を見てみましょう。
xml [<options>] <command> [<cmd-options>]
4.1. Pretty-XMLを印刷する
format コマンド(または短縮形の fo )を使用して、XMLファイルを再フォーマットできます。
$ xml format emails.xml
以下を出力します。
<?xml version="1.0"?>
<emails>
<email>
<from>Kai</from>
<to>Amanda</to>
<time>2018-03-05</time>
<subject>I am flying to you</subject>
<
</email>
<email>
<from>Jerry</from>
<to>Tom</to>
<time>1992-08-08</time>
<subject>Hey Tom, catch me if you can!</subject>
</email>
</emails>
上記の出力が示すように、emails.xmlはきれいに印刷されています。 xmllint コマンドと同じように、デフォルトのインデントは2つのスペース文字です。
xmllint と同様に、コマンドが入力から欠落している場合、XML宣言を追加することもわかります。
次に、xmlコマンドが提供するフォーマットオプションを見てみましょう。
4.2. フォーマットオプション
xml format コマンドには、出力を制御するための4つのオプションがあります。
- -nまたは–noindent :出力をインデントしません
- -tまたは–indent-tab :タブを使用して出力をインデントします
- -s また –インデントスペース
:出力をインデントする スペース - – o また –omit-decl :xml宣言を省略
emails.xmlファイルを使用してxmlformat コマンドを再度起動します。今回は、出力を8つのスペースでインデントし、XML宣言を省略します。
$ xml fo -o -s 8 emails.xml
以下を出力します。
<emails>
<email>
<from>Kai</from>
<to>Amanda</to>
<time>2018-03-05</time>
<subject>I am flying to you</subject>
</email>
<email>
...
</email>
</emails>
5. xml_ppコマンドの使用
5.1. Pretty-XMLを印刷する
その名前が示すように、 xml_pp は、XMLドキュメントをきれいな形式で印刷するために生まれました。 これを使用する構文は簡単です。
xml_pp [options] XML_FILES
emails.xmlをきれいに印刷できるかどうか見てみましょう。
$ xml_pp emails.xml
コマンドは次のように出力します。
<emails>
<email>
<from>Kai</from>
<to>Amanda</to>
<time>2018-03-05</time>
<subject>I am flying to you</subject>
</email>
<email>
<from>Jerry</from>
<to>Tom</to>
<time>1992-08-08</time>
<subject>Hey Tom, catch me if you can!</subject>
</email>
</emails>
出力は、インデントがここでも2つのスペース文字であることを示しています。
また、出力の先頭を見ると、入力にがない場合、XML宣言はデフォルトで追加されません。
5.2. 出力オプション
xmlformatおよびxmllintコマンドのようにインデントを設定することはできません。 また、 xml_pp コマンドには、ユーザーがインデントを変更するためのオプションがありません。
xml_pp ユーティリティは、次のような他の側面で出力を制御するためのオプションをサポートしています。
- -e
:出力エンコーディングを設定します - -p
:要素の空白を保持する - -s
: Control the output style
6. 結論
この記事では、 xmllint、XMLStarlet、、xml_ddなどの便利なユーティリティを使用してXMLファイルをきれいに印刷する方法について説明しました。