1. 概要

XML を使用する場合、 XPath を使用して、XMLドキュメント内の要素と属性をナビゲートできます。

このチュートリアルでは、LinuxコマンドラインでXPath式を評価する方法について説明します。

2. XMLの例とXPath式

まず、このチュートリアル全体で使用する入力XMLファイルとしてXMLドキュメントbooks.xmlを作成しましょう。

<books>
    <book id="1" category="linux">
        <title lang="en">Linux Device Drivers</title>
        <year>2003</year>
        <author>Jonathan Corbet</author>
        <author>Alessandro Rubini</author>
    </book>
    <book id="2" category="linux">
        <title lang="en">Understanding the Linux Kernel</title>
        <year>2005</year>
        <author>Daniel P. Bovet</author>
        <author>Marco Cesati</author>
    </book>
    <book id="3" category="novel">
        <title lang="en">A Game of Thrones</title>
        <year>2013</year>
        <author>George R. R. Martin</author>
    </book>
    <book id="4" category="novel">
        <title lang="fr">The Little Prince</title>
        <year>1990</year>
        <author>Antoine de Saint-Exupéry</author>
    </book>
</books>

books.xml ファイルには、4冊の本があります。 後で、LinuxコマンドラインでいくつかのXPath式を評価する方法について説明します。

  •   // title [@ lang =’fr’] –このXPath式は、フランス語で書かれた本のすべてのタイトル要素を選択します(「book」要素には「lang」があります値が「fr」の」属性)
  • // book [year> 2004] / title –このXPath式は、発行年が2004年より後の場合、すべての本のタイトル要素を選択します(「year」要素の値は 2004 より大きい)

このチュートリアルでは、コマンドラインでXPathを操作するための3つの異なるアプローチについて説明します。

  • xmllintコマンドの使用
  • XMLStarletツールキットの使用
  • xidelユーティリティの使用

3. xmllintコマンドの使用

xmllint コマンドは、xmllib2パッケージとともにインストールされます。 通常、このコマンドを使用して、XMLファイルの検証、XMLファイルの解析、またはXMLファイルのきれいな印刷を行うことができます。

xmllint コマンドは、XPath式を評価するための「 –xpath」オプションをサポートしています。

xmllint --xpath "XPATH_EXPRESSION" INPUT.xml

xmllib2XPath1.0 のみを実装するため、xmllintコマンドはXPath1.0のみをサポートします。

XPath式を使用してテストし、期待どおりの結果が得られるかどうかを確認しましょう。

まず、books.xmlで英語の本のすべてのタイトル要素を選択しましょう。

$ xmllint --xpath "//title[@lang='fr']" books.xml
<title lang="fr">The Little Prince</title>

TheLittlePrince」という本のtitle要素が出力に含まれています。 lang =” fr” 属性を持つ唯一のタイトル要素であるため、これは正しいです。

次に、他のXPath式をテストしてみましょう。

$ xmllint --xpath "//book[year>2004]/title" books.xml 
<title lang="en">Understanding the Linux Kernel</title>
<title lang="en">A Game of Thrones</title>

今回は、xmllintは2つのタイトル要素を出力します。 2番目のXPath式も、xmllintコマンドによって正しく評価されます。

4. XMLStarletツールキットの使用

XMLStarletは、に基づく強力なコマンドラインXMLツールキットです。 libxml2。 したがって、 xmllint 指図、 XMLStartletはXPath1.0のみをサポートします

XMLStartletには、 xml という実行可能ファイルが1つ付属しています。これは、xmlstarletコマンドの短縮形として使用できます。

4.1. XMLStarlet構文

xmlコマンドの構文は次のとおりです。

xml [options] <command> [command options]

XMLStarletは、さまざまなXML操作を実行するための一連のコマンドを定義します。たとえば、 ed edit )は、XMLドキュメントを編集または更新します。 tr transform )を使用して、XSLTなどを使用してXMLドキュメントを変換します。

XPathを使用してデータを選択したりXMLドキュメントをクエリしたりするには、sel(select)コマンドを使用できます。実際、selコマンドはXPath式の評価以上のことを実行できます。

基本的に、 sel コマンドを使用すると、XMLドキュメントクエリを実行するためのXSLTスタイルシートを作成する必要がなくなります。 コマンドラインオプションの組み合わせからXSLTを生成できます。

つまり、 sel コマンドを使用すると、XMLStarletはすべてのコマンド引数をXSLTに変換して、入力XMLドキュメントに対してクエリを実行します。

selコマンドの一般的な構文を見てみましょう。

xml sel -t <template options> Input.xml

XSLTテンプレートはXSLTの基本的な概念です。 selコマンドを使用して、-tオプションを使用してテンプレートを作成します。

このチュートリアルでは、XSLT変換については詳しく説明しません。 私たちの目標は、XPath式を評価することです。

sel コマンドは、多くのテンプレートオプションをサポートしています。 -c-vの2つを紹介します。これは、これら2つのテンプレートオプションがXPath評価に非常に一般的に使用されているためです。

たとえば、XPath式の評価結果が textであるとします。

  • The -c「XPath_Expression」 オプションは「 」—これにより、見つかったノードのコピーが作成されるため、次のようになります。 文章
  • The -v「XPath_Expression」 オプションは「 」—これにより、結果のXML要素の値が抽出されるため、次のようになります。 文章

4.2. xmlselコマンドを使用したXPath式の評価

それでは、2つのXPath式を試してみましょう。

最初に、-cテンプレートオプションを指定したxmlselコマンドを使用して最初のXPath式をテストします。

$ xml sel -t -c "//title[@lang='fr']" books.xml
<title lang="fr">The Little Prince</title>

出力が示すように、XPath式は正しく評価されており、期待されるtitle要素があります。

次に、-vテンプレートオプションを使用すると何が得られるかを見てみましょう。

$ xml sel -t -v "//title[@lang='fr']" books.xml
The Little Prince

今回は、XMLタグなしのtitle要素のテキストを取得しました。

それでは、他のXPath式を使用してコマンドをテストしてみましょう。

$ xml sel -t -c "/books/book[year>2004]/title" books.xml
<title lang="en">Understanding the Linux Kernel</title><title lang="en">A Game of Thrones</title>

-c オプションを使用すると、出力には2つの予想されるtitle要素が含まれます。

でも、 出力は「きれいに印刷」されていません。 XML要素間の改行はどういうわけか飲み込まれます。 

これは、要素間の改行が空白として扱われるために発生します。つまり、 the 命令は要素間のすべての空白を削除します

次に、-vオプションを使用すると何が得られるかを見てみましょう。

$ xml sel -t -v "/books/book[year>2004]/title" books.xml
Understanding the Linux Kernel
A Game of Thrones

出力が示すように、 -v オプションを使用すると、一致する要素のテキストが取得され、各値が別々の行に表示されます。

今回は、改行は削除されません。 結果に複数の要素がある場合、 に座ります要素、次のようなもの:

<xsl:for-each select="/books/book[year&gt;2004]/title">
    <xsl:value-of select="."/>
</xsl:for-each>

したがって、一致する各要素のテキストは別々の行に印刷されます。

5. xidelコマンドの使用

xidelコマンドは優れたXML/HTML / JSONデータ抽出ユーティリティであり、はXPath3.0をサポートします。

xidel コマンドとXPath式を使用してデータを抽出するのは、非常に簡単です。

xidel [options] --xpath "XPath Expression" XML_INPUT

後の例で見るように、出力を制御するためにいくつかのオプションを渡すことができます。

5.1. XPath式を使用したデータの抽出

最初のXPath式でxidelコマンドを試してみましょう。

$ xidel --xpath "//title[@lang='fr']" books.xml 
**** Retrieving: books.xml ****
**** Processing: books.xml ****
The Little Prince

出力からわかるように、xidelはデフォルトでステータス情報を出力します。 また、見つかった要素からテキストを自動的に抽出します。

ステータスメッセージをスキップしたい場合は、 -sオプションを追加して、xidelを「サイレント」モードで動作させることができます

さらに、 –printed-node-format =” xml”オプションを渡すことで、完全なXML要素を印刷するようにxidelに要求できます。

上のスクリーンショットは、 xidelコマンドの優れた機能の1つを示しています。xidel出力がXML形式の場合、コンソール出力の属性が強調表示されます。

次に、2番目のXPath式を使用してxidelコマンドを実行してみましょう。

$ xidel -s --printed-node-format="xml" --xpath "/books/book[year>2004]/title" books.xml
<title lang="en">Understanding the Linux Kernel</title>
<title lang="en">A Game of Thrones</title>

予想どおり、サンプルファイルから2つのtitle要素が出力されます。

5.2. XPath3.0式の評価

最後に、xidelコマンドがXPath3.0式で機能するかどうかをテストしてみましょう。

シーケンスデータ型は、XPath3.0以降に存在します。 したがって、発行年が指定された値のシーケンスにある場合は、シーケンスデータ型を使用してXPath式を記述し、ブック要素を印刷します。 // book [year =(2004、2005、2013、2020)] [ X186X]

xidel がこのXPath式を評価して、関心のある本を見つけることができるかどうかを見てみましょう。

$ xidel -s --printed-node-format="xml" --xpath "//book[year=(2004, 2005, 2013, 2020)]" books.xml
<book id="2" category="linux">
        <title lang="en">Understanding the Linux Kernel</title>
        <year>2005</year>
        <author>Daniel P. Bovet</author>
        <author>Marco Cesati</author>
    </book>
<book id="3" category="novel">
        <title lang="en">A Game of Thrones</title>
        <year>2013</year>
        <author>George R. R. Martin</author>
    </book>

これは、XPath3.0式で機能します。

xmllintとXMLStarletはXPath1.0のみをサポートしているため、次のXPath式を評価できません。

$ xmllint --xpath "//book[year=(2004, 2005, 2013, 2020)]" books.xml
XPath error : Invalid expression
//book[year=(2004, 2005, 2013, 2020)]
                 ^
XPath evaluation failure

$ xml sel -t -c "//book[year=(2004, 2005, 2013, 2020)]" books.xml
Invalid expression: //book[year=(2004, 2005, 2013, 2020)]
compilation error: element copy-of
xsl:copy-of : could not compile select expression '//book[year=(2004, 2005, 2013, 2020)]'

6. 結論

この記事では、LinuxコマンドラインでXPath式を評価する方法を紹介しました。

例を通して仕事をするために3つの異なるユーティリティに取り組みました。