DOM Level 2/3 標準技術をMSIEで使う(XML読み込みとXPath)

XML 文書読み込みの準備

注意

実際の記述

// 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() 関数では、

をしてみることにします。

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);
}

履歴

2004-03-30
MSXMLで名前空間を伴った要素を作成する際には、 createNode() メソッドを使う必要がありますので、修正させて頂きました(Hawk'sW3L の Hawk 様より御指摘を頂きました)。

関聯リンク

Hawk'sW3L: XMLメモ
国内で DOM XPath を扱っている数少ないサイト。非常に参考になります。