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はこれまでやったことがなかったし、興味があったので簡単な例で試してみました。
次回ご紹介します。