XML ドキュメントの処理

XMLというのは、言語仕様で、2000年ころからコンピュータ分野で広く採用されるようになりました。

単純な例を次に示します。

    <employees>
     	<employee id="101">
      		<firstName>Taro</firstName>
      		<lastName>Yamada</lastName>
    			・・・・・
     	</employee>
     	<employee id="102">
      		<firstName>Jiro</firstName>
      		<lastName>Suzuki</lastName>
    			・・・・・
     	</employee>
    		・・・・・
  </employees>

これは従業員名簿ですが、当然二人だけでなく沢山でいいし、項目も職種とか給与とか資格とか色々あるでしょう。階層も必要なだけ深くなっても構いません。

幾つか注意点があります。XMLファイル(ドキュメント)は、一つのルートを持つ木構造になっているということです。上の例では、木の根っこルートは<employees>です。一つのXMLドキュメントに複数のルートがあってはいけません。枝が絡み合ってもいけません。

幾つかのキーワードをご紹介します。
employees、employee 、firstName、lastName等はタグ(名)とわれ、タグは必ず開始タグと対応する終了タグがなければ以下ません。開始タグは[<]と[>]で囲まれ、終了タグは[< /]と[>]で囲われます。

上の例では、<employees>は開始タグ、</employees>は終了タグです。特殊な例としては、<employees id=”1″ firstName=”Hanako” />のように開始タグと終了タグが一つになることも有ります。

タグの中に書かれた上の例で、[id=”101″]は属性と言われます。

開始タグと終了タグで囲まれた部分を要素と言います。
上の例で、<firstName>Taro</firstName>は要素ですし、<employee id=”101″><firstName>Taro</firstName><lastName>Yamada</lastName></employee>は要素です。タグで囲まれた文字列は要素の内容と言います。TaroやYamadaやJiroやSuzukiは要素の内容です。

特に子要素をもつタグを節(ノード)と言います。木構造で枝分かれする付け根の部分=節に当たります。

 

ところで、上の例で「Jiro君の苗字は?」と聞かれて、「彼のの苗字はSuzuki」ですとすぐわかります。

これをコンピュータでどのように処理すればいいのか。という問題です。

現在二つの手法が提案されています(WindowsにはLINQ等専用の手法があります)。すなわち、SAXとDOMです。

SAXは、頑なにXMLドキュメントのルートから始まり、順に問いにたどり着こうとするものです。

上の例では、employees開始-> employee開始-> firstName開始->firstName終了->lastName開始->lastName終了-> ・・・・ ->employee終了

で最初のemployee検査を終了し、続いて次のemployeeの検査に進み、employee開始-> firstName開始「あ、見つかった」と必要な情報にたどり着き、あとはプログラムによって、色々な処理方法があると思います。今ここで重要なのは、SAXはこのように最初から順々に探していくということです。

一方のDOMは、ドキュメント全体を探し始めます。たとえば、firstNameタグを全部集めて、そこからJiroを探し出し、Jiro情報から直接lastNameタグのSuzukiを見つける方法です。

 

情報の抽出ではなく、XMLドキュメントを次の処理に扱いやすい新たなXMLドキュメントに変換する手法が、XLSTです。

Wordで単純な文章を作って、XML形式で書き出してみてください。驚ろくほど長文の複雑なXML形式の文章が出力されます。

一般にプログラムで機械的に出力されたXMLドキュメントは複雑な形をしています。扱いやすい形あるいは必要な形に成形してから、次の処理に回そうとか、そのままブラウザで表示しようとかのときは、XSLTはとても有効です。

個人的には、そのプログラミングはゲームやマジックを解くような感覚になり、とても楽しい作業です。

DOMやXSLTは10年以上前にやった経験がありますが、今はもうほとんど覚えていません。SAXはこれまでやったことがなかったし、興味があったので簡単な例で試してみました。

次回ご紹介します。

error: コピーできません !!