PHP5.0.3だと、DOMのsaveXML()とsave()がバグってる。createElement()で作られたエレメントノードは名前空間がnullになるはずなのに、親要素のデフォルト名前空間を引き継いでしまっている。
$dom = new DomDocument();
$rootNode = $dom->appendChild($dom->createElementNS("http://www.arielworks.com/", "root"));
$rootNode->appendChild($dom->createElement("child"));
print $dom->saveXML();
このようなコードを書いた場合、本来は次のようになるはずだ(見やすいように整形してある)。
<?xml version="1.0">
<root xmlns="http://www.arielworks.com/">
<child xmlns="">
</root>
しかし、実際には、強調した部分が抜け落ちてしまい、child要素の名前空間URIが「http://www.arielworks.com/」になってしまっている。
どうやら内部処理的には、きちんと「null」を保持しているようで、save()系のメソッドを使わなければ特に問題ない。恐らく、DOMツリーを文字列に変換する処理に何か問題があるのだろう。
「使うべきではない」というのはどちらかと言えば実装レベル寄りの話です。確かに、勧告にメソッド自体は書かれているので「使ってはいけない」ということは無いでしょうが、勧告の「1.1.8. XML Namespaces」の最後にあるように、混ぜるのは危険だと考えられます。
NULLの解釈についてですが、もしかするとそういうことなのかも知れません。しかし、『Namespaces in XML』には「The default namespace can be set to the empty string. This has the same effect, within the scope of the declaration, of there being no default namespace.」と書いてあり、「名前空間を持たない(xmlns="")」と「名前空間という概念がない(ドキュメント中に1回もデフォルト名前空間宣言がない)」は同値であると受け取ることも出来ます。さらに、「概念有りのノード」と「概念無しのノード」が同一文章中に同居する場合、文字列にダンプ出来なくなってしまう現象の回避方法など、「概念無し」の存在にはまだ少し疑問があります。
考えてみると「名前空間無しのXML」と言うものに関して、あまり知識がないのでCoreの部分の勧告を読み直す必要がありそうです。「名前空間という概念がないXML文章」イコール「デフォルト名前空間宣言がどこにもない」なのかも実は確信が無いので、時間があるときに、もう少し調べてみたいと思います。
http://yudai.arielworks.com/memo/2005/01/20/203929.trackback
末尾に「9 + 6」の計算結果を繋げて下さい。例えば計算結果が「17」の場合、「203929.trackback17」です。これは機械的なトラックバックスパムを防止するための措置です。