第4回 『 DOMと名前空間 』
XMLを処理するプログラミングとしてDOMプログラミングを使用する方も多いのではないでしょうか。今回のコラムでは、DOMと名前空間について考察してみます。
DOMの仕様(Core)はLevel 1,2,3が勧告されています。
Level 1の勧告は名前空間仕様の勧告より前でしたので、Level 1ではXML名前空間に対応していません。そしてLevel 2で名前空間を伴った処理を行うことが可能になりました。Level 2では???NSといった名前のいくつかのメソッドが導入され、Level 1メソッドが名前空間に対応しました。たとえばsetAttributeメソッドとsetAttributeNSメソッドはどちらも属性を追加(または更新)できますが、名前空間を伴った処理では必ずsetAttributeNSを使用します。そもそもLevel 1では名前空間の概念が導入されていませんので、Level 1のどのメソッドも、名前空間を適切に処理できることを期待することはできません。
Level 2で名前空間を伴った処理を行うことが可能になったわけですが、Level 2ではXML文書へのシリアライズの方法が定められていませんので、この点で実装依存となります。たとえばApache Xerces2-J(2.6.2)でプログラミングし、<root/>のroot要素に対してsetAttributeNS("urn:aaa","a:att","value")を実行し、XML文書として出力させると結果は<root a:att="value"/>となります。a接頭辞の名前空間宣言がありませんので名前空間仕様に違反していますが、これはシリアライズ時に名前空間宣言の解決が行われなかっただけであって、メソッドの実行自体がおかしかったわけではありません。シリアライズ直前の、DOMツリー上でのatt属性の名前空間を調べてみると、確かに"urn:aaa"です。(DOMプログラミングでatt属性のnamespaceURIアトリビュートを調べてみると分かります。)
Level 3ではDOMツリーをXML文書としてシリアライズする方法を定めましたので、この問題点も解決されました。特にLevel 3 Core仕様書のAppendix B(Namespaces Algorithms)では、名前空間宣言を解決するアルゴリズムが定められています。これに従って上記の結果をシリアライズすると、結果は<root a:att="value" xmlns:a="urn:aaa"/>となります。
今後このLevel 3が広く実装されると、標準的なシリアライズ結果を予測でき、DOMプログラミングにおいて名前空間宣言を意識する必要がなくなります。
日時: 2004年09月02日 11:56 | | TrackBack
