Udostępnij za pośrednictwem


XML DOM超入門

「すっかり更新が遅れて申し訳ありません」というセリフが決まり文句のようになってしまっております。本当にすみません。

次期バージョンのVisual Stuido(コードネームOrcas)の開発の方は、まだ軌道に乗り始めたばかりなのですが、むしろこういう初期段階のほうが忙しいものです。
・・・というのは言い訳ですね(笑)

さて、前回は「XMLを使いたいけれども新しい技術は使いたくない」という方のために、邪道な方法を紹介しましたが、今回はまともな方法でXMLを扱ってみたいと思います。

XMLは確かにテキストデータなので、前回テキストファイルとして読み書きすることも可能ではありますが、それではXMLの良さはほとんど生きてきません。
XMLデータは、あたかもデータベースにアクセスするかのように、必要なデータのみを持ってくるような使い方が、意味のある使い方かと思います。

そこで、今回の方法は、XMLをテキストデータとしてではなく、「オブジェクト」として、つまり実態がどういう構造なのかを知らなくても必要なデータが的確に引っ張ってこられるような物体として扱います。
そういうことをするための概念をXMLドキュメントオブジェクトモデル(XML DOM)と呼んでいます。

どうも、DOMなどという名前を聞くと難しそうですが、実際には簡単です。大雑把にいえば、やることは4つだけです。また必要なクラスはXmlDocument型、XmlNodeList型、XMLNode型の3つです。

  1. XmlDocument型のクラスをひとつ作る。(ここではxmlDocという名前にします。)
  2. そのxmlDocに、XMLデータを読み込む
  3. xmlDocから直接欲しいデータを引っ張ってくることはできないので、XMLNodeList型のクラスを作り、そこに先のxmlDocが示しているXMLデータの、実データを入れる。(ここではnodesという名前にします)
    このとき、必要なデータだけを取り出す(クエリする)ことも可能。
  4. 最後に、そのnodesにはいっているデータを表示したり、なにか処理したりするために、一つ一つのデータをループで取り出す。

たとえば、以下のようなXMLデータがファイルc:\temp\options.xmlに入っているとして、

<?xml version="1.0" encoding="utf-8"?>
<data>
  <option>
    <name>userid</name>
    <value>sa</value>
  </option>
  <option>
    <name>password</name>
    <value>testpass</value>
  </option>
</data>

このファイルの内容である<name>の値と<value>の値を表示させるためのコードは次のように書けます。

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("c:\\temp\\options.xml");
            string strXpathQuery = "/data/option";
            XmlNodeList nodes = xmlDoc.SelectNodes(strXpathQuery);
            foreach (XmlNode node in nodes)
            {
                foreach (XmlNode terminal_node in node)
                {
                    if (terminal_node.Name == "name")
                        Console.WriteLine( "名前は " + terminal_node.InnerText);
                    if (terminal_node.Name == "value")
                        Console.WriteLine( "値は " + terminal_node.InnerText);
                }
            }

簡単に説明します。
1行目で、XmlDocumentクラスの実体としてxmlDocを作り、2行目でそれに対してファイルからXMLデータを読み込んでいます。
3,4行目で必要なデータだけを絞り込んでXmlNodeListクラスの実体であるnodesにその結果を入れています。

ここで、string strXpathQuery = "/data/option"; と記述されていますが、これが必要なデータだけを絞り込むための働きをするもので、XPathと呼ばれるものです。
XPathにはそれ自身の文法があり、非常に細かい設定が可能なのですが、ここでは簡単に紹介します。

もしもXPathに "/" と指定すると、そのXMLデータのもっとも高い位置から検索をします。この例のXMLファイルに"/"を使って検索すると、一回目に引っかかるのが<?xml version="1.0" encoding="utf-8"?>で、2回目が<data>~</data>になります。

もしもXPathに "/Data" と指定すると、<Data>と</Data>に囲まれた中だけを検索します。

もしもXPathに "/Data/Option" と指定すると、<Data>の中の、<Option>と</Option>に囲まれた中だけを検索します。この例では2つ<Option>~</Option>がありますので、2個ヒットします。

したがって、4行目までの段階で、nodesには<options>が2つ入っているような形になります。
      nodes[0] = (一個目の<opitons>)
      nodes[1] = (2個目の<options>)

5行目のforeachループで、nodesの中の2つの要素のそれぞれに対して処理をするようにしてます。

6行目のループではさらに、一個の<option>の中の、<name>と<value>を取り出しています。Name はタグの名前を、InnerTextはその内容を表わしています。