XPath(XML Path Language)は、XMLドキュメントのクエリや変換をサポートするために設計された式言語です。1999年にWorld Wide Web Consortium (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年に(2010年に第2版)、XPath 3.0は2014年に、XPath 3.1は2017年に公開されました。しかし、XPath 1.0が依然として最も広く利用可能なバージョンです。[ 1 ]
for 」式を簡略化した式を提供します。XQuery から省略された部分を列挙することで、この言語を説明することができます。主な例としては、クエリ プロローグ、要素および属性のコンストラクタ、「FLWOR」構文の残りの部分、および式が挙げられます。typeswitch
XPathにおいて最も重要な式は位置パスです。位置パスは一連の位置ステップで構成されます。各位置ステップは3つの要素から成ります。
XPath 式はコンテキスト ノードを基準として評価されます。「child」や「descendant」などの軸指定子は、コンテキスト ノードからナビゲートする方向を指定します。ノード テストと述語は、軸指定子で指定されたノードをフィルタリングするために使用されます。たとえば、ノード テスト「A」は、ナビゲート先のすべてのノードにラベル「A」が付いていることを要求します。述語を使用すると、選択されたノードが特定のプロパティを持つことを指定できます。これらのプロパティは、XPath 式自体によって指定されます。
XPath構文には2種類あります。1つは省略構文で、より簡潔で、直感的で多くの場合馴染みのある文字や構造を使ってXPathを簡単に記述・読み取りできます。もう1つは完全構文で、より冗長ですが、より多くのオプションを指定でき、注意深く読めばより詳細な情報が得られます。
簡潔な表記法では、一般的なケースに対して多くのデフォルト値と省略形が使用できます。
<A> <B> <C/> </B> </A>最も単純なXPathは次のような形式をとります。
/A/B/Cこれは、XMLドキュメントの最外層要素であるA要素の子要素であるB要素の子要素であるC要素を選択します。XPath構文は、URI(Uniform Resource Identifier)およびUnixスタイルのファイルパス構文を模倣するように設計されています。
より複雑な式は、デフォルトの「子」軸以外の軸、単純な名前以外のノードテスト、または任意のステップの後に角括弧で囲んで記述できる述語を指定することで構築できます。たとえば、次の式
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 ]
省略構文で属性軸を使用する例として、ドキュメントツリー内の任意の要素で と//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
その他の場合、述語の値は自動的にブール値に変換されます。述語がノードセットに評価される場合、ノードセットが空でないときに結果は真になります。したがって、という名前の属性を持つ要素が選択されます。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= "English" > en.wikipedia.org </edition> <edition language= "German" > de.wikipedia.org </edition> <edition language= "French" > fr.wikipedia.org </edition> <edition language= "Polish" > pl.wikipedia.org </edition> <edition language= "Spanish" > es.wikipedia.org </edition> </editions> </project> <project name= "Wiktionary" launch= "2002-12-12" > <editions> <edition language= "English" > en.wiktionary.org </edition> <edition language= "French" > fr.wiktionary.org </edition> <edition language= "Vietnamese" > vi.wiktionary.org </edition> <edition language= "Turkish" > tr.wiktionary.org </edition> <edition language= "Spanish" > es.wiktionary.org </edition> </editions> </project> </projects> </Wikimedia>XPath式
/Wikimedia/projects/project/@name
すべてのプロジェクトの名前属性を選択し、
/Wikimedia//editions
すべてのプロジェクトのすべてのエディションを選択し、
/Wikimedia/projects/project/editions/edition[@language='English']/text()英語のウィキメディアプロジェクトのアドレスをすべて選択します(属性が英語に等しいすべての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 標準版の一部となっています。技術的には、これは XPath 実装ではなく XPath APIであり、プログラマーがインターフェースに準拠する特定の実装を選択できるようにします。
document.evaluate()[ 13 ]。XPathは、XMLのスキーマ言語において制約を表現するためにますます広く利用されている。
バージョン: 1.5
セレクタは、ページ上の 1 つ以上の要素を見つけるために使用できるパターンであり、要素内のデータを操作できます。Scrapy は、CSS セレクタまたは XPath セレクタのいずれかをサポートしています。