摘要:在基于使用命名空間的文檔求值時(shí),需要使用對(duì)象。第四個(gè)參數(shù)的取值類型是下列常量之一,返回與表達(dá)式匹配的數(shù)據(jù)類型。,返回字符串值。這是最常用的結(jié)果類型。集合中節(jié)點(diǎn)的次序與它們?cè)谖臋n中的次序一致。
JavaScript與XML 瀏覽器對(duì)XML DOM的支持 DOM2級(jí)核心
在通過JavaScript處理XML時(shí),通常只使用參數(shù)root,因?yàn)檫@個(gè)參數(shù)指定的是XML DOM文檔元素的標(biāo)簽名
var xmldom = document.implementation.createDocument("", "root", null); alert(xmldom.documentElement.tagName); //"root" var child = xmldom.createElement("child"); xmldom.documentElement.appendChild(child);DOMParser類型
在解析XML之前,首先必須創(chuàng)建一個(gè)DOMParser的實(shí)例,然后再調(diào)用parseFromString()方法,這個(gè)方法接收兩個(gè)參數(shù),要解析的XML字符串和內(nèi)容類型,返回的值是一個(gè)Document的實(shí)例
var parser = new DOMParser(); var xmldom = parser.parseFromString("XMLSerialize類型", "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類型提供了相反的功能,將DOM文檔序列化為XML字符串
要序列化DOM文檔,首先必須創(chuàng)建XMLSerializer的實(shí)例,然后將文檔傳入其serializeToString()方法
var serializer = new XMLSerializer(); var xml = serializer.serializeToString(xmldom); alert(xml);IE8及之前版本中的XML
6種不同的XML文檔版本可以供選擇
Microsoft.XmlDom,最初隨同IE發(fā)布,不建議使用
MSXML2.DOMDocument,為方便腳本處理而更新的版本,建議僅在特殊情況下作為后備版本使用
MSXML2.DOMDocument3.0,為了在JavaScript中使用,這是最低的建議版本
MSXML2.DOMDocument4.0,在通過腳本處理時(shí)并不可靠,使用這個(gè)版本可能導(dǎo)致安全警告
MSXML2.DOMDocument5.0,在通過腳本處理時(shí)并不可靠,使用這個(gè)版本可能導(dǎo)致安全警告
MSXML2.DOMDocument6.0,通過腳本能夠可靠處理的最新版本
如果解析過程中出錯(cuò),可以在parseError屬性中找到錯(cuò)誤信息,這個(gè)屬性本身是一個(gè)包含多個(gè)屬性的對(duì)象,每個(gè)屬性都保存著有關(guān)解析錯(cuò)誤的某一方面信息
errorCode,錯(cuò)誤類型的數(shù)值編碼,在沒有發(fā)生錯(cuò)誤時(shí)值為0
filePos,文件中導(dǎo)致錯(cuò)誤發(fā)生的位置
line,發(fā)生錯(cuò)誤的行
linepos,發(fā)生錯(cuò)誤的行中的字符
reason,對(duì)錯(cuò)誤的文本解釋
srcText,導(dǎo)致錯(cuò)誤的代碼
url,導(dǎo)致錯(cuò)誤的文件的URL
跨瀏覽器處理XML
對(duì)解析XML而言,下面函數(shù)可以在所有四種主要瀏覽器中使用
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; }瀏覽器對(duì)XPath的支持 DOM3級(jí)XPath
在DOM3級(jí)XPath規(guī)范定義的類型中,最重要的兩個(gè)類型是XPathEvaluator和XPathResult
XPathEvaluator用于在特定的上下文中對(duì)XPath表達(dá)式求值
createExpression(expression, nsresolver) :將 XPath 表達(dá)式及相應(yīng)的命名空間信息轉(zhuǎn)換成一個(gè) XPathExpression ,這是查詢的編譯版。在多次使用同一個(gè)查詢時(shí)很有用。
createNSResolver(node) :根據(jù) node 的命名空間信息創(chuàng)建一個(gè)新的 XPathNSResolver 對(duì)象。在基于使用命名空間的 XML 文檔求值時(shí),需要使用 XPathNSResolver 對(duì)象。
evaluate(expression, context, nsresolver, type, result) :在給定的上下文中,基于特定的命名空間信息來對(duì) XPath 表達(dá)式求值。剩下的參數(shù)指定如何返回結(jié)果。
evaluate()是最常用的,這個(gè)方法接收5個(gè)參數(shù):XPath表達(dá)式、上下文節(jié)點(diǎn)、命名空間求解器、返回結(jié)果的類型和保存結(jié)果的XPathResult對(duì)象。
其中第三個(gè)參數(shù)只在XML代碼中使用了XML命名空間時(shí)有必要指定,如果XML代碼中沒有使用命名空間,這個(gè)參數(shù)應(yīng)該指定為null。第四個(gè)參數(shù)的取值類型是下列常量之一
XPathResult.ANY_TYPE,返回與 XPath 表達(dá)式匹配的數(shù)據(jù)類型。
XPathResult.NUMBER_TYPE,返回?cái)?shù)值。
XPathResult.STRING_TYPE,返回字符串值。
XPathResult.BOOLEAN_TYPE,返回布爾值。
XPathResult.UNORDERED_NODE_ITERATOR_TYPE,返回匹配的節(jié)點(diǎn)集合,但集合中節(jié)點(diǎn)的次序不一定與它們?cè)谖臋n中的次序一致。
XPathResult.ORDERED_NODE_ITERATOR_TYPE,返回匹配的節(jié)點(diǎn)集合,集合中節(jié)點(diǎn)的次序與它們?cè)谖臋n中的次序一致。這是最常用的結(jié)果類型。
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,返回節(jié)點(diǎn)集合的快照,由于是在文檔外部捕獲節(jié)點(diǎn),因此對(duì)文檔的后續(xù)操作不會(huì)影響到這個(gè)節(jié)點(diǎn)集合。集合中節(jié)點(diǎn)的次序不一定與它們?cè)谖臋n中的次序一致。
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,返回節(jié)點(diǎn)集合的快照,由于是在文檔外部捕獲節(jié)點(diǎn),因此對(duì)文檔的后續(xù)操作不會(huì)影響到這個(gè)節(jié)點(diǎn)集合。集合中節(jié)點(diǎn)的次序與它們?cè)谖臋n中的次序一致。
XPathResult.ANY_UNORDERED_NODE_TYPE,返回匹配的節(jié)點(diǎn)集合,但集合中節(jié)點(diǎn)的次序不一定與它們?cè)谖臋n中的次序一致。
XPathResult.FIRST_ORDERED_NODE_TYPE,返回只包含一個(gè)節(jié)點(diǎn)的節(jié)點(diǎn)集合,包含的這個(gè)節(jié)點(diǎn)就是文檔中第一個(gè)匹配的節(jié)點(diǎn)
IE中的XPathIE對(duì)XPath的支持是內(nèi)置在基于ActiveX的XML DOM文檔對(duì)象中的,沒有使用DOMParser返回的DOM對(duì)象,因此,為了在IE9以及之前的版本中使用XPath,必須使用基于ActiveX的實(shí)現(xiàn),這個(gè)接口在每個(gè)節(jié)點(diǎn)上額外定義了兩個(gè)方法:selectSingleNode()和selectNodes()
跨瀏覽器使用XPath在其他使用DOM3級(jí)XPath對(duì)象的瀏覽器中,重新創(chuàng)建selectSingleNode()和selectNodes()方法。第一個(gè)函數(shù)接收三個(gè)參數(shù):上下文節(jié)點(diǎn)、XPath表達(dá)式和可選的命名空間對(duì)象
命名空間對(duì)象應(yīng)該是下面這種字面量形式
{ prefix1:"uri1", prefix2:"uri2", prefix3:"uri3" }
selectSingleNode()函數(shù)的完整代碼
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"){ //創(chuàng)建命名空間字符串 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."); } }瀏覽器對(duì)XSLT的支持 IE中的XSLT
與IE對(duì)其他XML功能的支持一樣,它對(duì)XSLT的支持也是通過ActiveX對(duì)象實(shí)現(xiàn)的,IE9中通過DOMParser創(chuàng)建的ODM文檔不能使用XSLT
使用XSLT樣式表轉(zhuǎn)換XML文檔的最簡(jiǎn)方式,就是將它們分別加到一個(gè)DOM文檔中,然后再使用transformNode()方法,這個(gè)方法存在于文檔的所有節(jié)點(diǎn)中,它接收一個(gè)參數(shù),即包含XSLT樣式表的文檔,調(diào)用transformNode()方法會(huì)返回一個(gè)包含轉(zhuǎn)換信息的字符串。
//加載 XML 和 XSLT(僅限于 IE) xmldom.load("employees.xml"); xsltdom.load("employees.xslt"); //轉(zhuǎn)換 var result = xmldom.transformNode(xsltdom);XSLTProcessor類型
XSLTProcessor也支持使用setParameter()來設(shè)置XSLT的參數(shù),這個(gè)方法接收三個(gè)參數(shù):命名空間URI、參數(shù)內(nèi)部名稱和要設(shè)置的值
命名空間URI都是null,而內(nèi)部名稱就是參數(shù)的名稱,另外,必須在調(diào)用transformToDocument()或transformToFragment()之前調(diào)用這個(gè)方法
var processor = new XSLTProcessor() processor.importStylesheet(xsltdom); processor.setParameter(null, "message", "Hello World! "); var result = processor.transformToDocument(xmldom);
還有兩個(gè)與參數(shù)相關(guān)的方法,getParameter()和removeParameter(),分別用于取得和移除當(dāng)前參數(shù)的值,這兩個(gè)方法都要接受命名空間參數(shù)和參數(shù)的內(nèi)部名稱
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);
重置處理器時(shí)要調(diào)用reset()方法,這個(gè)方法會(huì)從處理器中移除所有參數(shù)和樣式,然后就可以再次調(diào)用importStyleSheet(),以加載不同的XSLT樣式表
var processor = new XSLTProcessor() processor.importStylesheet(xsltdom); //執(zhí)行轉(zhuǎn)換 processor.reset(); processor.importStylesheet(xsltdom2); //再執(zhí)行轉(zhuǎn)換跨瀏覽器使用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."); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/97997.html
摘要:簡(jiǎn)介簡(jiǎn)史誕生于年,當(dāng)時(shí)主要負(fù)責(zé)表單的輸入驗(yàn)證。實(shí)現(xiàn)一個(gè)完整的由三部分組成核心文檔對(duì)象模型瀏覽器對(duì)象模型就是對(duì)實(shí)現(xiàn)該標(biāo)準(zhǔn)規(guī)定的各個(gè)方面內(nèi)容的語言的描述。把整個(gè)頁面映射為一個(gè)多層節(jié)點(diǎn)結(jié)構(gòu)。由萬維網(wǎng)聯(lián)盟規(guī)劃。主要目標(biāo)是映射文檔的結(jié)構(gòu)。 JavaScript簡(jiǎn)介 JavaScript簡(jiǎn)史 JavaScript誕生于1995年,當(dāng)時(shí)主要負(fù)責(zé)表單的輸入驗(yàn)證。 如果沒有表單驗(yàn)證的功能,填入信息之...
摘要:在不給這個(gè)方法傳遞參數(shù)的情況下,它會(huì)返回所有后代節(jié)點(diǎn)與使用相同,而傳遞一個(gè)名稱作為參數(shù)則可以限制結(jié)果。,表示解析器應(yīng)該忽略標(biāo)記中的處理指令。數(shù)據(jù)序列化相關(guān)的設(shè)置,表示在序列化時(shí),每次縮進(jìn)的空格數(shù)量。 E4X E4X的類型 E4X定義了幾個(gè)新的全局類型 XML,XML結(jié)構(gòu)中的任何一個(gè)獨(dú)立的部分 XMLList,XML對(duì)象的集合 Namespace,命名空間前綴與命名空間URI之間的映...
摘要:類型對(duì)象是的一個(gè)實(shí)例,表示整個(gè)頁面,而且,對(duì)象是對(duì)象的一個(gè)屬性,因此可以將其作為全局對(duì)象來訪問。刪除指定位置的行。創(chuàng)建創(chuàng)建創(chuàng)建第一行創(chuàng)建第二行將表格添加到文檔主體中 DOM 節(jié)點(diǎn)層次 Node類型 DOM1級(jí)定義了一個(gè)Node接口,該接口將由DOM中的所有節(jié)點(diǎn)類型實(shí)現(xiàn) 節(jié)點(diǎn)類型由在Node類型中定義的12個(gè)數(shù)值常量來表示,任何節(jié)點(diǎn)類型必居其一 Node.ELEMENT_NODE(...
摘要:如果不需要偽元素信息,第二個(gè)參數(shù)可以輸操作樣式表類型表示的是樣式表,包括通過元素包含的樣式表和在元素中定義的樣式表表示樣式表是否被禁用的布爾值。包括元素的高度可見的水平滾動(dòng)條的高度上邊框高度和下邊框高度。顯示處理指令節(jié)點(diǎn)。 DOM2和DOM3 DOM變化 針對(duì)XML命名空間的變化 有了XML命名空間,不同XML文檔的元素就可以混合在一起,共同構(gòu)成格式良好的文檔,而不必?fù)?dān)心發(fā)生命名沖突...
摘要:語法語法可以表示三種類型的值簡(jiǎn)單值使用與相同的語法,可以在中表示字符串?dāng)?shù)值布爾值和。對(duì)象對(duì)象作為一種復(fù)雜數(shù)據(jù)類型,表示的是一組無序的鍵值對(duì)兒。如果字符串長(zhǎng)度超過了個(gè),結(jié)果中將只出現(xiàn)前個(gè)字符。 JSON 語法 JSON語法可以表示三種類型的值 簡(jiǎn)單值:使用與 JavaScript 相同的語法,可以在 JSON 中表示字符串、數(shù)值、布爾值和 null 。但 JSON 不支持 JavaS...
閱讀 1503·2021-11-25 09:43
閱讀 2140·2021-07-26 23:38
閱讀 812·2019-08-30 15:53
閱讀 2363·2019-08-30 15:43
閱讀 1245·2019-08-29 18:40
閱讀 2020·2019-08-26 13:28
閱讀 2042·2019-08-23 18:20
閱讀 604·2019-08-23 15:07