IEとFireFoxでパーシングの仕方が違う!

 FireFox対応版、解決編。

  • XMLの各要素のアクセスにインデックスナンバーじゃなく文字列で指定したい。

 実は、XMLの処理に関しても、FireFoxでは動かない所があって、結果的にこの処理をすることで解決したとゆー。
 とりあえず、テスト用のサンプルを。

 XMLファイルは以下のようになっています。


data.xml

<?xml version="1.0" encoding="UTF-8" ?>
<pages>
    <page>
        <image>Do.jpg</image>
        <text>…………ちっちゃくないもん</text>
    </page>
</pages>


 このルートの要素数、つまり<pages>タグ内の要素数を取得します。


test.js

                // ルートの要素数の取得。
                var length 
                    = ajax.responseXML.documentElement.childNodes.length;

 childNodesに「子ノード」が入っているので、その要素数をlengthで取得します。
 <pages>タグの中には<page>タグしかないので、一見「1」になりそうですが、IEは「1」、FireFoxは「3」になります。
  IEFireFoxとでXMLHttpRequestで実装しているパーシング処理方法が違うらしく、FireFox版は「タグの間の空白やタブ」も数えちゃうみたいです。
 この点について書いてあるところがありました。

 ここを参考に、昨日のFireFox修正版では以下のようにしました。


test.js

                // <page>を取得します。
                var page 
                    = ajax.responseXML.documentElement.getElementsByTagName( "page" )[0];

                // <image>の中身を取得します。
                var imageUrl 
                    = page.getElementsByTagName( "image" )[0].childNodes[0].nodeValue;
                // イメージ置き換え先の取得。
                var imageObj = document.getElementById( imageObjId );
                // イメージを置き換えます。
                imageObj.src = imageUrl;


 話が前後しますが、要素をインデックスナンバーではなく文字列で取得するにはgetElementsByTagName()メソッドを使用します。
 このメソッドでタグを直接指定できるので、空白やタブを取得することはありません。
 このメソッドは、複数のタグが見つかった場合のために配列を返すので、[0]で最初のものだけ取得するようにします。


 ……ここまではいいんだが、正直、最後の「childNodes[0].nodeValue」はよくわからん(汗)。
 型をちゃんと理解してないからっぽいなぁ。
 次は「どれがどの型か」っていうのをちゃんとまとめることにします。


 うはぁ、エロゲーからどんどん離れてく……。