1. 程式人生 > >Javascript—XPATH技術解析XML

Javascript—XPATH技術解析XML

XML可擴充套件標記語言,作為傳輸和儲存資料的載體,在web開發中應用很廣泛。在我們需要將XML資料傳遞給前端時,需要用javascript解析才能使用,所以,使用javascript解析XML也是很普遍的。

通過javascript解析XML,我們可以使用DOM這個強大的工具(針對HTML文件、XML等文件的一套API),也就是通過getElementById或者getElementsByTagName這些方法解析XML

    那它們在解析XML時是否合適,我們考慮下下面的幾個問題:

    首先XML中每個元素節點不一定有id屬性;其次XML中的兩個元素節點可能有相同的id屬性;這樣使用

getElementById就不能保證找到我們需要的唯一節點了。而getElementsByTagName一次獲取的節點太多,在進行遍歷獲取資料,比較麻煩。

    就XML而言,對比JSONXML檔案龐大,格式複雜,在通過DOM解析顯然需要花費更過的資源和時間,使用者體驗肯定不好。

   有沒有更好點的方法呢?

XPATH技術—解決問題的良藥

         XPATH是什麼?全稱是XML Path LanguageXML路徑語言),適用於確定XML文件中某節點位置的語言。

    我們可以把它當作類似於SQL一樣的查詢語言,通過給出XPATH路徑資訊(就像SQL命令一樣)就可以從

XML中查找出符合條件的節點(就像從資料庫中返回需要的資料一樣)。

         Java中的DOM4j開源包中有selectSingleNodeselectNodes這樣兩個方法可以根據XPATH表示式來獲取一個或多個節點。

    在IE6.0及以後版本中我們可以使用同樣的方式來訪問任意深度的XML資料,這給XML資料的解析操作帶來了便利。

    但是在firefox等瀏覽器中,則是使用了w3c標準的XPATH處理方式,沒有IE這麼簡單的方式,firefox中需要建立相應的操作物件和計算方法,才能返回對應的節點。

   封裝方法建立在不同瀏覽器中都可進行XPATH操作的封裝方法

    //根據指定的XPATH表示式查詢滿足條件的所有節點
    //@param xmldoc 執行查詢的節點
    //@param sXpath xpath的表示式
    function selectNodes(xmldoc,sXpath){  
      
        if(window.ActiveXObject){       
            //IE瀏覽器     
            return xmldoc.selectNodes(sXpath);        
        }else if(window.XPathEvaluator){      
            //FireFox類瀏覽器       
            var xpathObj=new XPathEvaluator();  

            if(xpathObj){  
                     var result=xpathObj.evaluate(sXpath,xmldoc,null,XPathResult.ORDERED_NODE_ITEARTOR_TYPE,null);        
                var nodes=new Array();        
                var node;        
                while((node = result.iterateNext())!=null) {        
                    nodes.push(node);       
                }        
               return nodes;  
      
            }else{  
      
                return null;                              
            }  
      
        }else{        
            return null;        
        }        
    }  

    //根據指定的XPATH表示式查詢滿足條件的第一個節點
    //@param xmldoc 執行查詢的節點
    //@param sXpath xpath的表示式
    function selectSingleNode(xmldoc,sXpath){  
        if(window.ActiveXObject){       
            //IE瀏覽器        
            return xmldoc.selectSingleNode(sXpath);        
        }else if(window.XPathEvaluator){        
            //FireFox類瀏覽器        
            var xpathObj=new XPathEvaluator();        
            if(xpathObj){        
                var result=xpathObj.evaluate(sXpath,xmldoc,null,XPathResult.ORDERED_NODE_ITEARTOR_TYPE,null);                              
                return result.singleNodeValue;        
            }else{        
                return null;                               
            }        
        }else{        
            return null;        
        }        
    }  

      注:

   evaluate()方法返回的是一個節點列表,得到節點列表後iterateNext()方法來遍歷這個列表中的所有節點。而ORDERED_NODE_ITERATOR_TYPE就是節點的列表,按照文件中節點的屬性排列。

例項—通過XPATH表示式獲取XML資料

 XML

<?xml version="1.0" encoding="UTF-8"?>

<books>
    <book isdn="0001">
        <author>wang</author>
        <name>AJAX Professional</name>
        <price>35</price>
    </book>
    <book isdn="0002">
        <author>lee</author>
        <name>AJAX In Action</name>
        <price>65</price>
    </book>
    <book isdn="0003">
        <author>zhu</author>
        <name>AJAX For Dummies</name>
        <price>40</price>
    </book>
    <author>123</author>
</books>


   通過呼叫selectNodes()函式來獲取不同引數的值

    下面通過六個需求來進行說明

      <script type="text/javascript">
            function testxpath(){
                var rootElement = loadXML(true,"XPATH.xml");
                removeBlank(rootElement);
             
                //需求1,獲取元素節點
                //查詢所有的author元素節點
                //關鍵就是如何表式元素節點在DOM樹中的路徑
                // 絕對路徑 /books/book/author
                // 相對路徑 book/author
                // 全文件搜尋法 //author , //book/author
                var author1 = selectNodes(rootElement,"/books/book/author");
                var author2 = selectNodes(rootElement,"book/author");
                var author2 = selectNodes(rootElement,"//author");
                var author2 = selectNodes(rootElement,"//book/author");
                
                //需求2,獲取屬性節點
                //關鍵是先找到包含屬性節點的元素節點
                var isdn1 = selectNodes(rootElement,"/books/book/@isdn");
                var isdn2 = selectNodes(rootElement,"book/@isdn");
                var isdn3 = selectNodes(rootElement,"//book/@isdn");
                var isdn4 = selectNodes(rootElement,"//books/@isdn");
                
                //需求3,獲取文字節點
                //關鍵是找到包含文字節點的那個元素節點
                var text1 = selectNodes(rootElement,"/books/book/name/text()");
                var text2 = selectNodes(rootElement,"book/name/text()");
                var text3 = selectNodes(rootElement,"//book/name/text()");
                var text4 = selectNodes(rootElement,"//name/text()");
                
                //需求4,有條件的查詢元素節點
                //需要先找到元素節點,然後再增加條件表示式,[條件]
                var book1 = selectNodes(rootElement,"/books/book[@isdn]");
                var book2 = selectNodes(rootElement,"book[@isdn]");
                var book3 = selectNodes(rootElement,"//book[@isdn]");
                
                //需求5,多個新增與關係的查詢元素節點
                //需要首先找到元素節點,然後每一個查詢條件寫在一箇中括號中
                var bookA1 = selectNodes(rootElement,"/books/book[@isdn='0002'][price>35]");
                var bookA2 = selectNodes(rootElement,"book[@isdn='0002'][price>35]");
                var bookA3 = selectNodes(rootElement,"//book[@isdn='0002'][price>35]");
                
                //需求6,‘|’或關係查詢
                var bookA3 = selectNodes(rootElement,"//book[@isdn='0002']| /books/book[price>35]");
                
                alert("");
            }
        </script>

        XPath是對專門對XML操作的語言,通過XPath語言,可以很方便的找到你想要的那個節點,程式碼方便,而且效率。

        相比JSON,XML有優點也有缺點,各有優勢,進一步研究請關注我的部落格。


相關推薦

JavascriptXPATH技術解析XML

XML可擴充套件標記語言,作為傳輸和儲存資料的載體,在web開發中應用很廣泛。在我們需要將XML資料傳遞給前端時,需要用javascript解析才能使用,所以,使用javascript解析XML也是很普遍的。 通過javascript解析XML,我們可以使用DOM這個強

simpleXML技術解析xml文件(php)

返回 1.0 元素 出名字 === 所有 php 技術 PC 1.simpleXML的核心思想:以面向對象的方法來操作xml文件 此技術可以將xml文件的所有元素都轉成對象。會返回一個對象數組,再用foreach遍歷,即可得到元素的名稱,內容,和屬性值。 test.xml

XML:使用DOM技術解析xML檔案中的城市,實現select級聯選擇

<?xml version="1.0" encoding="utf-8"?> <china> <province name="北京"> <city>東城區</city> <city>

XML檔案解析--xpath技術

最近用到xml檔案解析,剛開始竟然忘了xpath,一股腦不斷的用各種for,for,for迴圈遍歷,還在想break來減少迴圈…,寫得差不多的時候覺得很不對勁,終於想到xpath(我不是菜鳥,我是小菜鳥…)。先了解下皮毛吧,記錄一下。 一、Element(元素

Java高級特性 第13節 解析XML文檔(1) - DOM和XPath技術

計算 form xpath ldoc previous practice 長度 然而 復雜 一、使用DOM解析XML文檔   DOM的全稱是Document Object Model,也即文檔對象模型。在應用程序中,基於DOM的XML分析器將一個XML文檔轉換成一個對象

解析XML技術

auth write public 屬於 creat extc implement ldoc inux 轉載:http://developer.51cto.com/art/200903/117512.htm XML現在已經成為一種通用的數據交換格式,它的平臺無關性,語言無關

dom和xpath解析xml

學生 auth term roc select 方法 try nodes 屬性 import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.D

用DOM解析XML ,用xpath快速查詢XML節點

XPath是一種快速查詢xml節點和屬性的一種語言,Xpath和xml的關係就像是sql語句和資料庫的關係。用sql語句可以從資料庫中快速查詢出東西同樣的用xPath也可以快速的從xml中查詢出東西。 下面的示例演示了怎麼用jdk自帶的rt.jar完成dom解析 程式碼如下: test.xml的程式碼如

Xpath解析XML(使用DOM4J)

最近在專案中需要使用XML作為資料對接載體,故解析XML檔案與字串、建立XML節點、修改XML節點的資訊及其attribute資訊、刪除節點、查詢節點的作為最使用的最基礎階段。 對比了多種xpath的多種包,發現dom4j是其中功能較為強大的工具,其中https://www.

xpath解析xml檔案

最近在做xml檔案的解析,需要獲取其中某些節點或某些屬性,一開始用迴圈來做,顯得很蠢,後來瞭解到dom4j,以及xpath,程式碼可讀性顯著增強。 首先取得xml檔案的根結點 SAXReader reader = new SAXReader(); File file = new File

javaScript解析XML時IE11瀏覽器不支援xmlDoc.load()方法

大家直接看原始碼和截圖吧!jsResolveXML.html<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>使用javascript解析xml&

go使用xpath解析 xml 格式資訊

一:使用github.com/beevik/etree 包解析xml檔案、http請求返回值。 1.讀取檔案 doc := etree.NewDocument() if err := doc.ReadFromFile("bookstore.xml"); err != nil {

dom4j之xpath解析xml

Xpath解析 Xpath是xml文件中元素的唯一路徑,通過該路徑能找到一個或多個Element,與html的xpath有類似的存在意義。dom4j中可以通過getUniquePath()獲取當前元素的Xpath。 # dom4j中有三個方法可以用於xpath查詢,dom4j-1

java核心技術卷2-2.2 解析XML文件

解析XML文件 2018年11月25日 星期日 上午11:46 要讀入一個XML文件,首先需要一個DocumentBuilder物件,可以從DocumentBuilderFactory中得到這個物件,例如: DocumentBuilderFactory fact

XML-Dom4j解析Xpath解析

package com.zking.xml; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXRead

dom4j解析XML時使用XPath直接定位至標籤例項

package edu.dom4j.dom; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4

java解析xml技術(二)

在上一篇java解析xml技術(一)中,我已經講完jdk中自帶解析xml的兩種方式dom和sax,現在我繼續講一講另一個java平臺下的xml解析工具dom4j。 dom4j就是dom for jav

C#通過XPath解析xml檔案

以上主要是我之前蒐集的,但是工作中還是遇到了一些小問題,比如說如何刪除一個XmlNode。為此,我做了以下demo static void Main(string[]

dom4j使用XPath解析XML返回null的解決方法

使用XPath解析XML的時候,在基本程式碼沒有寫錯的情況下,使用selectSingleNode()方法獲取xml的內容時返回null值,很有可能是因為xml設定了名稱空間。 1)在沒有名稱空間的情況下,book.xml的檔案(檔案位於src/cn/edu/gdut/we

Javascript輕鬆實現呼叫xslt解析xml

XML程式碼如下, <?xml version="1.0" encoding="ISO-8859-1"?> <rss version="2.0">   <channel>     <title>C-Sharpcorner La