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ファイルを簡単に再フォーマットできます。 デフォルトのインデントは2つのスペースです。 ただし、XMLLINT_INDENT環境変数を設定することで変更できます。 

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コマンドの使用

xml_ppコマンドは、PerlモジュールXML::Twigに付属しています。 名前 xml_pp 「XMLPretty-Printer」の略です。

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