ActiveXObject
, Mozilla では createDocument()
メソッドを使い、 XML 文書を格納するための「箱」を用意する必要があります。document.implementation.createDocument
が使えるようにすれば良いのですが、 イベント定義の時と同様の方法は使えないため、ここでは、次善策として、 document.Implementation.createDocument()
メソッドが使えるようにしたいと思います。selectSingleNode()
や singleNode()
メソッドは MSXML 2.0 で既に実装済みなので、 WinIE 5.x が導入されている環境であれば、簡単な XPath を用いて要素群を引き出すことは出来ます。// createDocument メソッドの定義 function _create(){ this.createDocument=function(a,b,c){return _createDoc(a,b,c);}; } function _createDoc(a,b,c) { var s=new _xmlDoc(a,b,c); return s; } // document.Implementation プロパティの定義と createDocument メソッドの登録 var _I=new _create; document.Implementation=_I; // createDocument() メソッドの中身を定義 function _xmlDoc(p,q,r){ var s; // XML 文書を格納するオブジェクトを定義 if (document.all && document.attachEvent){ // MSIE 用 s=new ActiveXObject("Microsoft.XMLDOM"); s.setProperty("SelectionLanguage", "XPath"); s.async=false; } else if (document.implementation.createDocument){ // Mozilla 用 s=document.implementation.createDocument(p,q,r); } // onload イベント制馭の定義 this.addEventListener=function(ev,func,bl) { if (document.all && document.attachEvent) { // MSIE 用 if (ev=="load") { s.onreadystatechange = function(){ if (s.readyState == 4){func()}; }; } } else if (document.implementation.createDocument){ // Mozilla 用 s.addEventListener(ev,func,bl); } }; // XML 読み込み関数の定義 this.load=function(fl) { s.load(fl); }; // 要素取り出しの定義 (getElementsByTagName) this.getElementsByTagName=function(elm) { return s.getElementsByTagName(elm); }; // 要素取り出しの定義 (getElementsByTagName) this.getElementsByTagNameNS=function(ns,elm) { // MSIE 用(XPath使用) if (document.all && document.attachEvent){ return s.selectNodes("//*[local-name()='"+elm+"' and namespace-uri()='"+ns+"']"); } else if (document.implementation.createDocument) { // Mozilla 用 return s.getElementsByTagName(ns,elm); } } // 要素の作成 this.createElementNS=function(ns,elm) { if (document.all && document.attachEvent) { // MSIE 用 return s.createNode(1,elm,ns); // 汎用ノード作成メソッドを使用 } else if (document.implementation.createDocument){ // Mozilla 用 return s.createElementNS(ns,elm); } }; // DOM3 XPath の evaluate()メソッドの定義 this.evaluate=function(reg,ob,n1,n2,n3) { if document.all && document.attachEvent) { // MSIE 用 var t=new xpathObj(s,reg); return t; } else if (document.implementation.createDocument) { return s.evaluate(reg,s,n1,n2,n3); } }; } // snapshotItem() 及び snapshotLength の定義 function xpathObj(s,reg) { var p=s.selectNodes(reg); this.snapshotItem=function(n) { return p[n]; }; this.snapshotLength=p.length; }
data.xml
を読み込んで xmlD
変数に格納し、その後 startXML()
関数を呼び出してみます。
startXML()
関数では、
p
要素を XPath
を用いて elm
変数に格納する。p
要素の数を表示。p
要素内のノード数を表示。をしてみることにします。
MSIE 6.0SP1, Mozilla, Netscape 7 では問題なく動作するようです。
// XML 文書を格納する「箱」を定義 var xmlD = document.Implementation.createDocument("", "", null); // ファイルを読み込んだ後、 startXML 関数を実行するようにする。 xmlD.addEventListener("load", startXML, false); // data.xml を読み込む。 xmlD.load("data.xml"); function startXML(){ // XPath による要素の取り出し var elm=xmlD.evaluate("//*[local-name()='p' and namespace-uri()='http://www.w3.org/1999/xhtml']",xmlD,null,6,null); // elm 中の要素数 alert (elm.snapshotLength); //elm 中の要素へのアクセス alert (elm.snapshotItem(3).childNodes.length); }
createNode()
メソッドを使う必要がありますので、修正させて頂きました(Hawk'sW3L の Hawk 様より御指摘を頂きました)。