連載

.NETで簡単XML

第5回 DOMとXPath

株式会社ピーデー 川俣 晶
2003/06/10
Page1 Page2 Page3 Page4

XPathによるノード選択

 .NET FrameworkのDOMには、XPathと呼ばれる言語を使用してノードを選択する機能が含まれている。これは、マイクロソフトの独自拡張だが、XPathそのものはW3C(World Wide Web Consortium)の勧告である。

 まずは、XPathの機能を使ったサンプル・プログラムとその出力を見てみよう。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim doc As XmlDocument = New XmlDocument()
  doc.Load("c:\sample.xml")
  Dim list As XmlNodeList = doc.SelectNodes("/書籍情報/著者/名前")
  Dim node As XmlNode
  For Each node In list
    Trace.WriteLine(node.InnerText)
  Next
End Sub
Xpathによるノード選択のサンプル(VB.NET版C#版
 

 ここで注目すべき点は、SelectNodesメソッドと、その引数に記述された文字列である。SelectNodesメソッドは、引数で指定されたXPath式に当てはまるノードを探して返す。探すノードの指定方法が違う点を除けば、GetElementsByTagNameメソッドと似ているメソッドである。では、引数の文字列であるXPath式はいったい何を表現しているのだろうか。

 XML文書は木構造になっていて、文書ツリーを構成しているが、これに似たものがある。それはファイルとディレクトリである。ファイルとディレクトリも木構造を構成している。例えば、WindowsならCドライブのDocumentディレクトリの中のファイルsample.txtは、“C:\Document\sample.txt”のように表現する。UNIX系のOSならルート・ディレクトリの下のhomeディレクトリの下にあるuserディレクトリのさらに下にあるファイルsammple.txtは、“/home/user/sample.txt”のように表現する。XPathの式も、これと似ている。

 先ほどのサンプルでSelectNodesメソッドの引数に指定されている“/書籍情報/著者/名前”ならば、ルート・ノードの下の“書籍情報”要素ノードの下の“著者”要素ノードのさらに下にある“名前”要素ノードを示す。この式では、ルート・ノードからの経路がすべて明示されているので、それに当てはまらないノードは除外される。今回の場合なら、いくら“名前”という名前を持った要素ノードがあっても、この式に合致する条件を満たさなければ、対象とは見なされない。これにより、1回の検索で必要な要素ノードのみを選択することができる。

 なお、XML文書の木構造をディレクトリとファイルの木構造に似たようなものとして説明を行ったが、それとは似ていないこともある。例えば、1つのディレクトリの中に、同じ名前のファイルは1つしか存在できないが、XML文書の場合、同じ名前の要素は複数存在することができる。それゆえに、XPath式が指定する対象は複数になる可能性がある。先ほどの例では、3つの要素ノードが発見されている。

 もし、見つけだすべきノードが1つに限られる場合は、SelectNodesメソッドではなく、SelectSingleNodeというメソッドを使用することもできる。これを用いた例は後で出てくる。

XPathの歴史

 さて、XPathとはいったい何だろうか。XPathの歴史はなかなか紆余曲折しているので、ここで簡単に紹介しておこう。

 XMLが誕生したときに、その周辺にさまざまな標準言語が産声を上げた。すぐに完成して勧告されたものは少ないが、ともかく、多数の言語が名乗りを上げたのである。その中には、XML専用のスタイルシート言語であるXSLというものもあった。これは主に2つの言語から構成されていた。1つは、ページ情報を記述するフォーマッティング・オブジェクト、もう1つは任意のXML文書をフォーマッティング・オブジェクトに変換するための変換言語である。しかし、この変換言語はフォーマッティング・オブジェクトだけでなく、HTMLや任意のXML文書などへの変換にも使用でき、便利であるために分離独立してXSLTという名前を与えられた。

 一方、XSLと同じように生まれたものに、ハイパーリンクを実現するXML専用言語であるXLinkがある。これは、リンクそのものの記述方法と、リンク対象を指定するポインタ言語に分かれることになる。後者はXPointerという名前を与えられている。その後、XSLTの式表現とXPointerの式表現が統合されて、XPathという独立した仕様が生まれたのである。このように、出生の経緯を見るだけでも、なかなか複雑なものなのである。

 XPathはスタイルシート変換やリンクで利用されるが、応用範囲はそれに留まらない。実際に、XSLTともXPointerとも関係ない場面で利用される機会も増えている。例えば、今回紹介するDOMで利用するXPathもその1つである。

 このような経緯から分かるとおり、XPathはDOMのマイクロソフト独自拡張メソッドのための言語ではなく、XSLTなどでも使用される汎用性の高い言語である。XMLを扱っていくなら、勉強しておいて損はないといえる。もっとも、汎用性の高さはメリットだけをもたらしてくれない。ある種の使い方では、ちょっと面倒なコーディングを要求される場合もある。その一例が、次に紹介する名前空間の指定である。


 INDEX
  .NETで簡単XML
  第5回 DOMとXPath
    1.DOMの死角
  2.XPathによるノード選択例とXPathの歴史
    3.名前空間の指定方法/文書のノード以外のノードから使う
    4.指定番目、属性値によるノード選択
 
インデックス・ページヘ  「連載 :.NETで簡単XML」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間