第5回 『XML文書の空白処理』
XML文書に、改行やインデントなどの無意味な空白が含まれる場合があります。たとえば次のXML文書では2箇所に含まれています。<root>開始タグと<value>開始タグの間の空白と、</value>終了タグと</root>終了タグの間の空白です。
<root>
<value>50</value>
</root>
この2箇所の空白は見た感じ無意味だと思われますが、XMLを処理するパーサーがこれらの空白をどう扱うかは、特定のルールに従います。
●SAX
================================================
SAXパーサーは、無意味だと判断できる場合にその空白をignorableWhitespaceメソッドの方へ送り、そうでない場合にはその空白をcharactersメソッドに送ります。
無意味だと判断できる場合とは、XML文書に文書型宣言があり、DTDの要素型宣言が要素内容(element content)として宣言(この場合ならたとえば、<!ELEMENT root (value*)>)され、なおかつSAXパーサーがこれを構文解析した場合です。当然ながら妥当性の検証を行う場合には、必ず構文解析します。しかしそうでない場合にSAXパーサーが要素型宣言を構文解析するかしないかは、パーサー次第です。
●DOM
================================================
DOM Level 2まででは、XML文書の読み込みと妥当性の検証についての仕様が定められていませんでしたので、XML文書の読み込み時に無意味な空白をどう扱うかについては明確に定められていませんでした。実際、Apache Xercesはデフォルトですべての空白を読み込み、Microsoft社の.NETのXMLパーサーはデフォルトでは無意味な空白を読み込みません。
ところがDOM Level 3では、XML文書の読み込み時にすべての空白をデフォルトで読み込むよう定められました。もちろんこれは既定値ですので、設定(ここではプロパティとよびます)により変更することができます。.NETのパーサーはこれに相当するプロパティ(これはMicrosoftの拡張機能であり、DOM Level3仕様とイコールではない)を実装していますので、DOM Level 3との違いには注意したいところです。
今後DOM Level 3を実装するパーサーを扱う場合には、無意味な空白の読み込み方法を、明示的に設定した方がよいかもしれません。
日時: 2004年09月30日 12:00 | | TrackBack
