高程3總結#第18章JavaScript與XML

JavaScript與XML

瀏覽器對XML DOM的支持

DOM2級核心

  • 在經過JavaScript處理XML時,一般只使用參數root,由於這個參數指定的是XML DOM文檔元素的標籤名javascript

    var xmldom = document.implementation.createDocument("", "root", null);
    alert(xmldom.documentElement.tagName); //"root"
    var child = xmldom.createElement("child");
    xmldom.documentElement.appendChild(child);

DOMParser類型

  • 在解析XML以前,首先必須建立一個DOMParser的實例,而後再調用parseFromString()方法,這個方法接收兩個參數,要解析的XML字符串和內容類型,返回的值是一個Document的實例java

    var parser = new DOMParser();
    var xmldom = parser.parseFromString("<root><child/></root>", "text/xml");
    alert(xmldom.documentElement.tagName); //"root"
    alert(xmldom.documentElement.firstChild.tagName); //"child"
    var anotherChild = xmldom.createElement("child");
    xmldom.documentElement.appendChild(anotherChild);
    var children = xmldom.getElementsByTagName("child");
    alert(children.length); //2

XMLSerialize類型

  • XMLSerialize類型提供了相反的功能,將DOM文檔序列化爲XML字符串
  • 要序列化DOM文檔,首先必須建立XMLSerializer的實例,而後將文檔傳入其serializeToString()方法node

    var serializer = new XMLSerializer();
    var xml = serializer.serializeToString(xmldom);
    alert(xml);

IE8及以前版本中的XML

  • 6種不一樣的XML文檔版本能夠供選擇express

    • Microsoft.XmlDom,最初隨同IE發佈,不建議使用
    • MSXML2.DOMDocument,爲方便腳本處理而更新的版本,建議僅在特殊狀況下做爲後備版本使用
    • MSXML2.DOMDocument3.0,爲了在JavaScript中使用,這是最低的建議版本
    • MSXML2.DOMDocument4.0,在經過腳本處理時並不可靠,使用這個版本可能致使安全警告
    • MSXML2.DOMDocument5.0,在經過腳本處理時並不可靠,使用這個版本可能致使安全警告
    • MSXML2.DOMDocument6.0,經過腳本可以可靠處理的最新版本
  • 若是解析過程當中出錯,能夠在parseError屬性中找到錯誤信息,這個屬性自己是一個包含多個屬性的對象,每一個屬性都保存着有關解析錯誤的某一方面信息瀏覽器

    • errorCode,錯誤類型的數值編碼,在沒有發生錯誤時值爲0
    • filePos,文件中致使錯誤發生的位置
    • line,發生錯誤的行
    • linepos,發生錯誤的行中的字符
    • reason,對錯誤的文本解釋
    • srcText,致使錯誤的代碼
    • url,致使錯誤的文件的URL

跨瀏覽器處理XML

  • 對解析XML而言,下面函數能夠在全部四種主要瀏覽器中使用安全

    function parseXml(xml){
      var xmldom = null;
      if (typeof DOMParser != "undefined"){
        xmldom = (new DOMParser()).parseFromString(xml, "text/xml");
        var errors = xmldom.getElementsByTagName("parsererror");
        if (errors.length){
          throw new Error("XML parsing error:" + errors[0].textContent);
        }
      } else if (typeof ActiveXObject != "undefined"){
        xmldom = createDocument();
        xmldom.loadXML(xml);
        if (xmldom.parseError != 0){
          throw new Error("XML parsing error: " + xmldom.parseError.reason);
        }
      } else {
        throw new Error("No XML parser available.");
      }
      return xmldom;
    }

瀏覽器對XPath的支持

DOM3級XPath

  • 在DOM3級XPath規範定義的類型中,最重要的兩個類型是XPathEvaluator和XPathResult
  • XPathEvaluator用於在特定的上下文中對XPath表達式求值app

    • createExpression(expression, nsresolver) :將 XPath 表達式及相應的命名空間信息轉換成一個 XPathExpression ,這是查詢的編譯版。在屢次使用同一個查詢時頗有用。
    • createNSResolver(node) :根據 node 的命名空間信息建立一個新的 XPathNSResolver 對象。在基於使用命名空間的 XML 文檔求值時,須要使用 XPathNSResolver 對象。
    • evaluate(expression, context, nsresolver, type, result) :在給定的上下文中,基於特定的命名空間信息來對 XPath 表達式求值。剩下的參數指定如何返回結果。dom

      • evaluate()是最經常使用的,這個方法接收5個參數:XPath表達式、上下文節點、命名空間求解器、返回結果的類型和保存結果的XPathResult對象。
      • 其中第三個參數只在XML代碼中使用了XML命名空間時有必要指定,若是XML代碼中沒有使用命名空間,這個參數應該指定爲null。第四個參數的取值類型是下列常量之一函數

        • XPathResult.ANY_TYPE,返回與 XPath 表達式匹配的數據類型。
        • XPathResult.NUMBER_TYPE,返回數值。
        • XPathResult.STRING_TYPE,返回字符串值。
        • XPathResult.BOOLEAN_TYPE,返回布爾值。
        • XPathResult.UNORDERED_NODE_ITERATOR_TYPE,返回匹配的節點集合,但集合中節點的次序不必定與它們在文檔中的次序一致。
        • XPathResult.ORDERED_NODE_ITERATOR_TYPE,返回匹配的節點集合,集合中節點的次序與它們在文檔中的次序一致。這是最經常使用的結果類型。
        • XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,返回節點集合的快照,因爲是在文檔外部捕獲節點,所以對文檔的後續操做不會影響到這個節點集合。集合中節點的次序不必定與它們在文檔中的次序一致。
        • XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,返回節點集合的快照,因爲是在文檔外部捕獲節點,所以對文檔的後續操做不會影響到這個節點集合。集合中節點的次序與它們在文檔中的次序一致。
        • XPathResult.ANY_UNORDERED_NODE_TYPE,返回匹配的節點集合,但集合中節點的次序不必定與它們在文檔中的次序一致。
        • XPathResult.FIRST_ORDERED_NODE_TYPE,返回只包含一個節點的節點集合,包含的這個節點就是文檔中第一個匹配的節點

IE中的XPath

  • IE對XPath的支持是內置在基於ActiveX的XML DOM文檔對象中的,沒有使用DOMParser返回的DOM對象,所以,爲了在IE9以及以前的版本中使用XPath,必須使用基於ActiveX的實現,這個接口在每一個節點上額外定義了兩個方法:selectSingleNode()和selectNodes()

跨瀏覽器使用XPath

  • 在其餘使用DOM3級XPath對象的瀏覽器中,從新建立selectSingleNode()和selectNodes()方法。第一個函數接收三個參數:上下文節點、XPath表達式和可選的命名空間對象
  • 命名空間對象應該是下面這種字面量形式編碼

    {
      prefix1:"uri1",
      prefix2:"uri2",
      prefix3:"uri3"
    }
  • selectSingleNode()函數的完整代碼

    function selectSingleNode(context, expression, namespaces){
      var doc = (context.nodeType != 9 ? context.ownerDocument : context);
      if (typeof doc.evaluate != "undefined"){
        var nsresolver = null;
        if (namespaces instanceof Object){
          nsresolver = function(prefix){
            return namespaces[prefix];
          };
        }
        var result = doc.evaluate(expression, context, nsresolver,
                                  XPathResult.FIRST_ORDERED_NODE_TYPE, null);
        return (result !== null ? result.singleNodeValue : null);
      } else if (typeof context.selectSingleNode != "undefined"){
        //建立命名空間字符串
        if (namespaces instanceof Object){
          var ns = "";
          for (var prefix in namespaces){
            if (namespaces.hasOwnProperty(prefix)){
              ns += "xmlns:" + prefix + "='" + namespaces[prefix] + "' ";
            }
          }
          doc.setProperty("SelectionNamespaces", ns);
        }
        return context.selectSingleNode(expression);
      } else {
        throw new Error("No XPath engine found.");
      }
    }

瀏覽器對XSLT的支持

IE中的XSLT

  • 與IE對其餘XML功能的支持同樣,它對XSLT的支持也是經過ActiveX對象實現的,IE9中經過DOMParser建立的ODM文檔不能使用XSLT
  • 使用XSLT樣式錶轉換XML文檔的最簡方式,就是將它們分別加到一個DOM文檔中,而後再使用transformNode()方法,這個方法存在於文檔的全部節點中,它接收一個參數,即包含XSLT樣式表的文檔,調用transformNode()方法會返回一個包含轉換信息的字符串。

    //加載 XML 和 XSLT(僅限於 IE)
    xmldom.load("employees.xml");
    xsltdom.load("employees.xslt");
    //轉換
    var result = xmldom.transformNode(xsltdom);

XSLTProcessor類型

  • XSLTProcessor也支持使用setParameter()來設置XSLT的參數,這個方法接收三個參數:命名空間URI、參數內部名稱和要設置的值
  • 命名空間URI都是null,而內部名稱就是參數的名稱,另外,必須在調用transformToDocument()或transformToFragment()以前調用這個方法

    var processor = new XSLTProcessor()
    processor.importStylesheet(xsltdom);
    processor.setParameter(null, "message", "Hello World! ");
    var result = processor.transformToDocument(xmldom);
  • 還有兩個與參數相關的方法,getParameter()和removeParameter(),分別用於取得和移除當前參數的值,這兩個方法都要接受命名空間參數和參數的內部名稱

    var processor = new XSLTProcessor()
    processor.importStylesheet(xsltdom);
    processor.setParameter(null, "message", "Hello World! ");
    alert(processor.getParameter(null, "message")); //輸出"Hello World!"
    processor.removeParameter(null, "message");
    var result = processor.transformToDocument(xmldom);
  • 重置處理器時要調用reset()方法,這個方法會從處理器中移除全部參數和樣式,而後就能夠再次調用importStyleSheet(),以加載不一樣的XSLT樣式表

    var processor = new XSLTProcessor()
    processor.importStylesheet(xsltdom);
    //執行轉換
    processor.reset();
    processor.importStylesheet(xsltdom2);
    //再執行轉換

跨瀏覽器使用XSLT

function transform(context, xslt){
if (typeof XSLTProcessor != "undefined"){
  var processor = new XSLTProcessor();
  processor.importStylesheet(xslt);
  var result = processor.transformToDocument(context);
  return (new XMLSerializer()).serializeToString(result);
} else if (typeof context.transformNode != "undefined") {
  return context.transformNode(xslt);
} else {
  throw new Error("No XSLT processor available.");
}
}
相關文章
相關標籤/搜索