在經過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);
在解析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
要序列化DOM文檔,首先必須建立XMLSerializer的實例,而後將文檔傳入其serializeToString()方法node
var serializer = new XMLSerializer(); var xml = serializer.serializeToString(xmldom); alert(xml);
6種不一樣的XML文檔版本能夠供選擇express
若是解析過程當中出錯,能夠在parseError屬性中找到錯誤信息,這個屬性自己是一個包含多個屬性的對象,每一個屬性都保存着有關解析錯誤的某一方面信息瀏覽器
對解析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; }
XPathEvaluator用於在特定的上下文中對XPath表達式求值app
evaluate(expression, context, nsresolver, type, result) :在給定的上下文中,基於特定的命名空間信息來對 XPath 表達式求值。剩下的參數指定如何返回結果。dom
其中第三個參數只在XML代碼中使用了XML命名空間時有必要指定,若是XML代碼中沒有使用命名空間,這個參數應該指定爲null。第四個參數的取值類型是下列常量之一函數
命名空間對象應該是下面這種字面量形式編碼
{ 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樣式錶轉換XML文檔的最簡方式,就是將它們分別加到一個DOM文檔中,而後再使用transformNode()方法,這個方法存在於文檔的全部節點中,它接收一個參數,即包含XSLT樣式表的文檔,調用transformNode()方法會返回一個包含轉換信息的字符串。
//加載 XML 和 XSLT(僅限於 IE) xmldom.load("employees.xml"); xsltdom.load("employees.xslt"); //轉換 var result = xmldom.transformNode(xsltdom);
命名空間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); //再執行轉換
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."); } }