趣味は車輪の再発明♪

XPathの基本


詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識
Gary Bradski Adrian Kaehler
オライリージャパン
売り上げランキング: 25,746


■ たかみんつ / ソフト開発メモINDEX /


XPathはXMLの階層構造のたどり方を指定する

ノード

XML内の要素や属性をノード(Node)という。XML要素はエレメント(Element)、属性はアトリビュート(Attribute)と呼んだりする。

XMLはノードが階層的に構成されている。つまり、ノードの中に複数のノードが含まれている。 一番上の階層のノードは、ただひとつだけの要素で、これはルートエレメントと呼んだりする。

XPathはXMLの階層構造のたどり方

あるノードを示したいとき、「基点となる要素(コンテキストノードという)から、どのようにノードをたどるか?」をXPathで指定する。

XPathはノード名を'/'でつなげた文字列。

ノード名は、要素の場合はその名前(&lt;Foo/&gt;という要素ならFoo)。 また、属性なら、属性の名前の前に@を付けたもの。(<<Foo Bar='Foobar'/>のBar属性を得たい場合のXPathはFoo/@Bar`となる)

たとえば、A/BというXPathは、「Aという要素の下のBという要素」を選択する。 これで選択されるのはBという要素。これは複数あるかもしれないし、ひとつもないかもしれない。

もうひとつ、A/B/@C なら、Aの下のB要素の属性Cを選択する。

以下に、ノードの指定方法をまとめた。

表記 意味
. コンテキストノード
.. コンテキストノードの親ノード
要素名
@属性名

上で、XPathはスラッシュでつないだものと書いたが、//もある。これは、コンテキストノード以下のどの階層も対称にするということを示す。 つまり、.//AというXPathはコンテキストノードの直下とだけでなく、その下まで検索してAを探し当てる。 .//A/B//@Fooも指定可能。ひとつのスラッシュだと、その直下が検索範囲だが、二つになると下まで探すということ。

ちなみに、XPathが/で始まっているときは、コンテキストノードに関連なく、ルートノードからの検索となる。

要素を限定する。

選択する要素を限定するには、要素名の後に[条件]を記述する。たとえば、下のようにすると、 「直下のCondition要素のAttribute属性が'Value'であるElement要素」(①)が選択される。

例①) //Element[./Condition/@Attribute='Value']

条件は途中にも指定できる。特定条件のElement直下のSub要素②を選択するには以下のようにする。

例②) //Element[./Condition/@Attribute='Value']/Sub

サンプルXML

<Element>
    <Condition Attribute='foo'/>
</Element>
<Element><!-- ① -->
    <Condition Attribute='Value'/>
    <Sub/><!-- ② -->
</Element>
<Element>
    <Condition/>
</Element>

複合条件

[]内にはAND条件やOR条件を指定できる。

比較演算子

演算子 意味
and 一致
or 一致
= 一致
!= 不一致

一般的に、AND条件は、and演算子、OR条件は or演算子と説明されているが、JScriptでは&&||が使用できた。 ただし、C#ではエラーになった。MSXMLのバージョンによるのかもしれない。


Pythonプロフェッショナルプログラミング 第2版
秀和システム (2015-05-21)
売り上げランキング: 1,813


クラウドではじめる機械学習 Azure MLでらくらく体験
脇森浩志 杉山雅和 羽生貴史
リックテレコム
売り上げランキング: 2,081

実践Node.js プログラミング (Programmer's SELECTION)
Mike Cantelon Marc Harter T.J. Holowaychuk Nathan Rajlich
翔泳社
売り上げランキング: 40,213

■ たかみんつ / ソフト開発メモINDEX /



RSS Feed Widget
XPathの基本
(http://bicycle.life.coocan.jp/takamints/index.php/doc/xpath)
by Koji Takami ( email: vzg03566@gmail.com, GitHub: takamin )