JavaScript操作XPathの基本的な方法を簡単に理解する

7137 ワード

Xpathは今私たちにあまり使われていません.JSONは今盛んに行われているからです.しかし、XMLがデータ交換フォーマットであった時代、Xpathは大きなxmlドキュメント構造にランダムにアクセスする際に非常に重要な位置を果たしていた.皆さんは今気づいていないかもしれませんが、DOM Level 3 XPathが指定したインタフェースはすでにFirefox、Safari、Chrome、and Operaで実現されています.彼らが実現したコアインタフェースはXPathEvaluatorであり、xpath式を使用して動作できる方法が含まれています.最も主要な方法はevaluate()であり、5つのパラメータ1.xpathクエリー文字列を受け入れることができる2.xpathクエリー文字列がどのノードから始まるべきかを示す3.ネーミングスペース解析器(後述)4.返される結果タイプ5.返される結果がそのオブジェクトに追加されるべきである(結果は主にevaluate()によって返されるため、あまり使用されない).
主に10の異なる戻りタイプがあります.それぞれがXPathResultオブジェクトの定数を表します.
  • XPathResult.ANY_TYPE xpath式に適したデータ型
  • XPathResult.ANY_UNORDERED_NODE_TYPEは、ドキュメントと異なる順序で一致するノードのセットを返します.
  • XPathResult.BOOLEAN_TYPEはbooleanタイプ
  • を返します.
  • XPathResult.FIRST_ORDERED_NODE_TYPEは、ドキュメント内の一致するノードの最初のノードを返します.
  • XPathResult.NUMBER_TYPEはnumタイプ
  • を返す
  • XPathResult.ORDERED_NODE_ITERATOR_TYPEは、一致するノードのセットを返し、ドキュメントと同じ順序で
  • を返します.
  • XPathResult.ORDERED_NODE_SNAPSHOT_TYPEは、ノードセットフラグメントを返し、ドキュメントの外でノードをキャプチャします.これにより、将来のドキュメントの変更はノードセットに影響しません.ノードセットの順序は、ドキュメントと同じです.
  • XPathResult.STRING_TYPEはstringタイプ
  • を返します.
  • XPathResult.UNORDERED_NODE_ITERATOR_TYPEは、ドキュメントと異なる順序で一致するノードのセットを返します.
  • XPathResult.UNORDERED_NODE_SNAPSHOT_TYPEは、ノードセットフラグメントを返し、ドキュメントの外でノードをキャプチャします.これにより、将来のドキュメントの変更はノードセットに影響しません.ノードセットの順序は、ドキュメントと同じである必要はありません.

  • こんなにたくさん紹介されていますが、これらのapiをどのように使用して操作すればいいのでしょうか.evaluate()関数が返す情報は、リクエストの結果タイプに完全に依存します.xpathクエリーを実行するには、XPathEvaluatorオブジェクトを使用する必要があります.新しいオブジェクトを生成したり、内蔵されたオブジェクトを使用したりすることができます.新しいオブジェクトを生成すると、XPathEvaluatorを初期化します.
    
    var evaluator = new XPathEvaluator(); 
    //     div 
    var result = evaluator.evaluate("//div", document.documentElement, null, 
             XPathResult.FIRST_ORDERED_NODE_TYPE, null); 
    alert("First div ID is " + result.singleNodeValue.id); 
    

    Firefox、Safari、Chrome、and Operaでは、すべてのドキュメントインスタンスにXPathEveluatorインタフェースが実装されています.これにより、HTMLページで実行するクエリーであればdocumentを使用することができます.evaluate()は、XMLHttpRequestまたはその他のメカニズムによってXMLドキュメントが得られる場合、evaluate()メソッドも使用できます.たとえば、次のようになります.
    
    //get first div 
    var result = document.evaluate("//div", document.documentElement, null, 
             XPathResult.FIRST_ORDERED_NODE_TYPE, null); 
    alert("First div ID is " + result.singleNodeValue.id); 
    

    次に、マルチノードを返す方法を2つ説明します.まず、インスタンスを見てみましょう.
    
    //get all divs - iterator style 
    var result = document.evaluate("//div", document.documentElement, null, 
             XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); 
    if (result){ 
      var node = result.iterateNext(); 
      while(node) { 
        alert(node.id); 
        node = node.iterateNext(); 
      } 
    } 
    //get all divs - SNAPSHOT style 
    var result = document.evaluate("//div", document.documentElement, null, 
             XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 
    if (result){ 
      for (var i=0, len=result.snapshotLength; i < len; i++) { 
        alert(result.snapshotItem(i).id); 
      } 
    } 
    

    ネーミングスペースhtmlドキュメントでxpathを使用する単純なクエリーであれば、evaluate()のネーミングスペース解析パラメータはnullが一般的です.ネーミングスペースを含むxmlドキュメントでxpathを使用してクエリーする傾向がある場合は、ネーミングスペース解析器の作成と使用方法を学ぶ必要があります.デフォルトのネーミングスペースを除いて、各ネーミングスペースURIは指定された接頭辞にマッピングされます.各ネーミングスペース解析器はxpathエンジンのネーミングスペース解析器です.接頭辞とネーミングスペースuriの間でマッピングされます.名前空間解析器を生成する方法は2つあります.1つ目は、パラメータとして名前空間接頭辞を受け入れる方法を作成し、対応するurlを返します.次のようにします.
    
    function resolver(prefix){ 
      switch(prefix){ 
        case "wrox": return "http://www.wrox.com/"; 
        case "ncz": return "http://www.nczonline.net/"; 
        default: return "http://www.yahoo.com/"; 
      } 
    } 
    

    2つ目は、ネーミングスペース情報を含むノードを使用して、ネーミングスペース解析器を生成します.
    
     
      Professional JavaScript 
     

    要素にはすべてのネーミングスペース情報が含まれています.このノードの参照をXPathEvaluatorオブジェクトのcreateNSResovler()メソッドに渡すと、ネーミングスペース解析器が自動的に得られます.たとえば、次のようになります.
    
    var evaluator = new XPathEvaluator(); 
    var resolver = evaluator.createNSResolver(xmldoc.documentElement); 
    

    上記のいずれかの方法を使用すると、ネーミングスペースを含むxmlドキュメントで簡単にクエリーできます.
    
    var evaluator = new XPathEvaluator(); 
    var resolver = evaluator.createNSResolver(xmldoc.documentElement); 
    var result = evaluator.evaluate("wrox:book", xmldoc.documentElement, 
             resolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null); 
    if (result){ 
      alert(result.singleNodeValue.firstChild.nodeValue); 
    } 
    

    注意:ネーミングスペースを含むxml文でクエリーを実行し、ネーミングスペース解析器を提供しないとエラーが発生します.
    IEブラウザのxpathに対するサポートIE 8はDOM Level 3 XPathで定義されたインタフェースを実現していないが、xpathに対しても一定のサポートがあり、IEのxpath機能は主にxmlドキュメントに対して利用可能であり、documentのオブジェクトに対しては利用できない.IEでxmlドキュメントを生成する方法:
    
    function createDocument(){ 
      if (typeof arguments.callee.activeXString != "string"){ 
        var versions = ["MSXML2.DOMDocument.6.0", 
                "MSXML2.DOMDocument.3.0", 
                "MSXML2.DOMDocument"]; 
        for (var i=0,len=versions.length; i < len; i++){ 
          try { 
            var xmldom = new ActiveXObject(versions[i]); 
            arguments.callee.activeXString = versions[i]; 
            return xmldom; 
          } catch (ex){ 
            //skip 
          } 
        } 
      } 
      return new ActiveXObject(arguments.callee.activeXString); 
    } 
    

    ドキュメントオブジェクトを生成した後、loadXML()メソッドを使用してコンテンツをロードできます.
    
    var xmldoc = createDocument(); 
    xmldoc.loadXML(""); 
    

    第2の方法は、XMLHttRequestオブジェクトによってxmlオブジェクトの生成を要求する.
    
    var xhr = new XMLHttpRequest(), 
      xmldoc; 
    xhr.open("get", "data.xml", true); 
    xhr.onreadystatechange = function(){ 
      if (xhr.readyState == 4){ 
        if (xhr.status >= 200 && xhr.status < 300){ 
          xmldoc = xhr.responseXML; 
        } 
    }; 
    xhr.send(null); 

    3つ目の方法はラベルを使用し、Microsoftはxmlデータ島と呼ばれています.以下のようにします.
    
    
    

    次に、
    
    var xmldoc = document.getElementById("myXML").XMLDocument;
    

    XPathサポート:ie内のxmlドキュメントオブジェクトでxpathをサポートするには、selectSingleNode()and selectNodes()という2つの組み込みメソッドがあります.各メソッドはxpath式をパラメータとして受け入れ、最初の一致するノードとすべての一致するノードに戻します.ネームスペースのサポート:
    
    
      Professional JavaScript
    

    このxmlドキュメントでは、まずsetProperty()を使用してxmlドキュメントのネーミングスペースを設定する方法を使用してクエリーを行います.
    
    xmldoc.setProperty("SelectionNamespaces",
      "xmlns:wrox='http://www.wrox.com/' xmlns='http://www.amazon.com/'");
    var book = xmldoc.documentElement.selectSingleNode("wrox:book");