| XPath | |
|---|---|
| パラダイム | クエリ言語 |
| 開発者 | W3C |
| 初登場 | 1998 |
| 安定版リリース | 3.1 / 2017年3月21日 ( 2017-03-21 ) |
| 影響を受けた | |
| XSLT、XPointer | |
| 影響を受けた | |
| XMLスキーマ、XForms、JSONPath | |
XPath(XMLパス言語)は、XML文書のクエリや変換をサポートするために設計された式言語です。1999年にワールドワイドウェブコンソーシアム(W3C)によって定義され、 [ 1 ] XML文書の内容から値(文字列、数値、ブール値など)を計算するために使用できます。XPathは、WebブラウザなどのXMLをサポートするアプリケーションや、多くのプログラミング言語でサポートされています。
XPath言語はXML文書のツリー表現に基づいており、様々な基準でノードを選択しながらツリー内を移動する機能を提供します。[ 2 ] [ 3 ]一般的な用法では(公式仕様ではありませんが)、XPath式は単に「XPath」と呼ばれることがよくあります。
もともとXPointerとXSLTの間に共通の構文と動作モデルを提供したいという要望から生まれたXPathクエリ言語のサブセットは、 XML スキーマ、XForms、国際化タグ セット (ITS)などの他のW3C仕様でも使用されています。
XPath は数多くの XML 処理ライブラリやツールに採用されており、その多くはXPath のよりシンプルな代替手段として、別の W3C 標準である CSS セレクターも提供しています。
XPathには複数のバージョンが使用されています。XPath 1.0は1999年に、XPath 2.0は2007年に(第2版は2010年に)、XPath 3.0は2014年に、XPath 3.1は2017年に公開されました。しかし、XPath 1.0は現在でも最も広く利用されているバージョンです。[ 1 ]
for 」式を簡略化した式を提供します。XQueryから省略されている部分を列挙することで、XPath 2.0の言語を記述することができます。主な例としては、クエリプロローグ、要素と属性のコンストラクタ、残りの「FLWOR」構文、そして式が挙げられます。typeswitch
XPathにおいて最も重要な式はロケーションパスです。ロケーションパスは、一連のロケーションステップで構成されます。各ロケーションステップには、以下の3つの要素があります。
XPath式はコンテキストノードを基準に評価されます。「child」や「descendant」などの軸指定子は、コンテキストノードからのナビゲーション方向を指定します。ノードテストと述語は、軸指定子で指定されたノードをフィルタリングするために使用されます。例えば、ノードテスト「A」は、ナビゲーション先のノードすべてがラベル「A」を持つ必要があることを要求します。述語は、選択されたノードが特定のプロパティを持つことを指定するために使用できます。これらのプロパティは、XPath式自体によって指定されます。
XPath構文には2つの種類があります。短縮構文はよりコンパクトで、直感的で多くの場合使い慣れた文字と構文を使用してXPathを簡単に記述および読み取ることができます。完全構文はより冗長ですが、より多くのオプションを指定でき、注意深く読めばより説明的です。
コンパクト記法では、一般的なケースに対して多くのデフォルトや省略形が使用できます。少なくとも以下の内容を含むソースXMLが与えられます。
<A> <B> <C/> </B> </A>最も単純なXPathは次の形式を取る。
/A/B/CXML文書の最外部要素であるA要素の子であるB要素の子であるC要素を選択します。XPath構文は、URI(Uniform Resource Identifier)およびUnix形式のファイルパス構文を模倣するように設計されています。
より複雑な式は、デフォルトの「child」軸以外の軸、単純な名前以外のノードテスト、または任意のステップの後に角括弧で囲んで記述できる述語を指定することによって構築できます。例えば、
A//B/*[1]は、現在のコンテキスト ノードの子である要素 A の*[1]子またはその他のより深い子孫 (' ') であるすべての要素 B の最初の子 (' ') を選択します(式は ' ' で始まっていません)。述語は演算子よりも強く結合します。式によって選択される最初のノードを選択するには、 と記述します。また、XPath 述語のインデックス値 (技術的には、XPath ノード セットの '近接位置') は、C や Java などの言語で一般的な 0 ではなく、1 から始まることにも注意してください。 ///[1]/A//B/*(A//B/*)[1]
完全な省略されていない構文では、上記の2つの例は次のように記述されます。
/child::A/child::B/child::Cchild::A/descendant-or-self::node()/child::B/child::node()[position()=1]ここで、XPath の各ステップでは、軸(例:childまたはdescendant-or-self) が明示的に指定され、::その後にノード テスト が続きます (上記の例の またはAなど)。node()
以下は同じですが、短いです。A//B/*[position()=1]
軸指定子は、XML文書のツリー表現におけるナビゲーション方向を示します。使用可能な軸は次のとおりです。[ b ]
| 完全な構文 | 省略構文 | 注記 |
|---|---|---|
ancestor | ||
ancestor-or-self | ||
attribute | @ | @abcの略語attribute::abc |
child | xyzの略語child::xyz | |
descendant | ||
descendant-or-self | // | //の略語/descendant-or-self::node()/ |
following | ||
following-sibling | ||
namespace | ||
parent | .. | ..の略語parent::node() |
preceding | ||
preceding-sibling | ||
self | . | .の略語self::node() |
省略構文における属性軸の使用例として、 はドキュメントツリー内の任意の要素で//a/@hrefという属性を選択します。式. ( self::node()の省略形) は、述語内で現在選択されているノードを参照するために最もよく使用されます。例えば、 は現在のコンテキストでという要素を選択し、そのテキストコンテンツは です。 hrefah3[.='See also']h3See also
gsノードテストは、特定のノード名、またはより一般的な式で構成できます。名前空間プレフィックスが定義されているXML文書の場合、その名前空間内の//gs:enquiryすべての要素を検索し、ローカル名に関係なく、その名前空間内のすべての要素を検索します。 enquiry//gs:*
その他のノード テスト形式は次のとおりです。
<!-- Comment -->hello:<k>hello<m> world</m></k><?phpecho$a;?>processing-instruction('php')述語は角括弧で囲まれた式として記述され、特定の条件に従ってノードセットをフィルタリングするために使用できます。例えば、aはノードセット(aコンテキストノードの子であるすべての要素)を返し、その中で属性値がである要素のみを保持します。 a[@href='help.php']hrefhelp.php
ステップ内の述語の数に制限はなく、XPathの最後のステップに限定される必要もありません。また、任意の深さまでネストできます。述語で指定されたパスは、現在のステップ(つまり、直前のノードテスト)のコンテキストから始まり、そのコンテキストを変更しません。一致が成立するには、すべての述語が満たされる必要があります。
述語の値が数値の場合、それはノード集合内のノードの位置(関数 によって指定されるposition())と比較するための構文糖です。つまりp[1]、 は と の省略形で、コンテキストノードの最初の子要素を選択します。一方、 は と の省略形で、コンテキストノードの 最後の子要素を選択します。p[position()=1]pp[last()]p[position()=last()]p
それ以外の場合、述語の値は自動的にブール値に変換されます。述語がノードセットに評価される場合、ノードセットが空でなければ結果は true になります。したがって、という名前の属性を持つ要素がp[@x]選択されます。 px
より複雑な例:式は、コンテキストノードの子要素のうち、属性が に設定されている最初の要素の属性値を選択します。ただし、ドキュメントの最上位要素の属性も に設定されている必要があります。最初の述語における最上位要素の属性への参照は、他の述語のコンテキストにも、ロケーションステップ自体のコンテキストにも影響を与えません。 a[/html/@lang='en'][@href='help.php'][1]/@targettargetahrefhelp.phphtmllangen
述語がノードの位置をテストする場合、述語の順序は重要です。各述語はノード集合を受け取り、(潜在的に)より小さいノード集合を返します。したがって、 はコンテキストノードの最初の子が条件 を満たす場合にのみ一致を見つけますが、 はこの条件を満たす最初の子を見つけます。 a[1][@href='help.php']a@href='help.php'a[@href='help.php'][1]a
XPath 1.0 では、ノード セット (固有の順序を持たないノードのセット)、文字列、数値、ブール値の 4 つのデータ型が定義されています。
利用可能な演算子は次のとおりです。
/、、//および演算子。[...]|2 つのノード セットの結合を形成する結合演算子。andとor関数not()+(除算)、および-*divmod=、、、、、、!=<><=>=関数ライブラリには以下が含まれます。
以下に、より一般的に役立つ機能のいくつかについて詳しく説明します。[ c ]
true場合を返しますs1s2true場合に返しますs1s2substring("ABCDEF",2,3)を返しますBCD。substring-before("1999/04/01","/")返品1999substring-after("1999/04/01","/")返品04/01述語内では演算子 と を用いて式を作成できます=, !=, <=, <, >=。ブール式は、括弧とブール演算子と、および上記の関数>と組み合わせることができます。数値計算にはと を使用できます。文字列は任意のUnicode文字 で構成できます。()andornot()*, +, -, divmod
//item[@price>2*@discount]価格属性が割引属性の数値の 2 倍より大きい商品を選択します。
ノードセット全体は、縦棒文字 | を使用して結合( 「結合」or )できます。複数の条件のうち1つ以上を満たすノードセットは、述語内の条件を ' ' で結合することで見つけることができます。
v[x or y] | w[z]現在のコンテキストで見つかった、子要素を持つすべての要素と、子要素を 持つvすべての要素で構成される単一のノード セットを返します。xywz
サンプルXML文書が与えられた場合
<?xml version="1.0" encoding="utf-8"?> <Wikimedia> <projects> <project name= "Wikipedia" launch= "2001-01-05" > <editions> <edition language= "英語" > en.wikipedia.org </edition> <edition language= "ドイツ語" > de.wikipedia.org </edition> <edition language= "フランス語" > fr.wikipedia.org </edition> <edition language= "ポーランド語" > pl.wikipedia.org </edition> <edition language= "スペイン語" > es.wikipedia.org </edition> </editions> </project> <project name= "Wiktionary" launch= "2002-12-12" > <editions> <edition language= "英語" > en.wiktionary.org </edition> <edition language= "フランス語" > fr.wiktionary.org </edition> <edition language= "ベトナム語" > vi.wiktionary.org </edition> <edition language= "トルコ語" > tr.wiktionary.org </edition> <edition language= "スペイン語" > es.wiktionary.org </edition> </editions> </project> </projects> </Wikimedia>XPath式
/ウィキメディア/プロジェクト/プロジェクト/@名前
すべてのプロジェクトの名前属性を選択し、
/ウィキメディア//エディション
すべてのプロジェクトのすべてのエディションを選択し、
/Wikimedia/projects/project/editions/edition[@language='English']/text()は、英語版ウィキメディアプロジェクトのアドレス(属性がEnglishであるすべてのedition要素のテキスト)を選択します。そして、次の language
/Wikimedia/projects/project[@name='Wikipedia']/editions/edition/text()すべての Wikipedia のアドレス (名前属性がWikipediaeditionである要素の下に存在するすべての要素のテキスト) を選択します。 project
Java パッケージは、Java API for XML Processingを通じてJava 5 [ 12 ]javax.xml.xpath以降、Java Standard Editionの一部となっています。技術的には、これはXPath実装ではなくXPath APIであり、プログラマーはインターフェースに準拠した特定の実装を選択できます。
document.evaluate()[ 13 ]。XPath は、XML のスキーマ言語で制約を表現するためにますます使用されるようになっています。
バージョン: 1.5
セレクターは、ページ上の1つ以上の要素を検索して、その要素内のデータを操作するために使用できるパターンです。scrapyはCSSセレクターとXPathセレクターのいずれかをサポートしています。