1. 程式人生 > >深入淺出如何解析xml檔案---下篇

深入淺出如何解析xml檔案---下篇

    在上篇博文中,小編主要介紹xml的兩種解析方式,分別是dom4j和dom,今天這篇博文,小編主要來簡單介紹一下xml的其她兩種解析方式sax和jdom。

    sax解析xml檔案

    sax,全稱是Simple API for XML ,即是一種介面,也是一種軟體包,她也是一種xml解析的替代方法,sax不同於dom解析,她逐行掃描文件,一邊掃描一邊解析,由於應用程式只是在讀取資料時檢查資料,因為不需要將資料儲存在記憶體中,這對於大型文件的解析是個巨大優勢。

    sax這種處理的優點非常類似於流媒體的優點。分析能夠立即開始,而不是等待所有的資料被處理。而且,由於應用程式只是在讀取資料時檢查資料,因此不需要將資料儲存在記憶體中。這對於大型文件來說是個巨大的優點。事實上,應用程式甚至不必解析整個文件;它可以在某個條件得到滿足時停止解析。一般來說,SAX 還比它的替代者 DOM 快許多。如下deom所示:

    <?xml version="1.0" encoding="UTF-8"?>  
    <root>  
        <student id="1" group="1">  
            <name>張三</name>  
            <sex>男</sex>  
            <age>18</age>  
            <email>[email protected]</email>  
            <birthday>1987-06-08</birthday>  
            <memo>好學生</memo>  
        </student>  
        <student id="2" group="2">  
            <name>李四</name>  
            <sex>女</sex>  
            <age>18</age>  
            <email>
[email protected]
</email> <birthday>1987-06-08</birthday> <memo>好學生</memo> </student> <student id="3" group="3"> <name>小王</name> <sex>男</sex> <age>18</age> <email>
[email protected]
</email> <birthday>1987-06-08</birthday> <memo>好學生</memo> </student> <student id="4" group="4"> <name>小張</name> <sex>男</sex> <age>18</age> <email>[email protected]</email> <birthday>1987-06-08</birthday> <memo>好學生</memo> </student> <student id="5" group="5"> <name>小明</name> <sex>男</sex> <age>18</age> <email>[email protected]</email> <birthday>1987-06-08</birthday> <memo>好學生</memo> </student> </root>
      使用sax解析如下所示:
    import java.util.ArrayList;  
    import java.util.List;  
      
      
    import org.xml.sax.Attributes;  
    import org.xml.sax.SAXException;  
    import org.xml.sax.helpers.DefaultHandler;  
      
      
      
    /**  
     * 功能描述:採用sax方式解析XML<br>  
     *   
     * @author 丁國華
     *  
     */  
    public class SaxParseXml extends DefaultHandler{  
      
        //存放遍歷集合  
        private List<Student> list;  
        //構建Student物件  
        private Student student;  
        //用來存放每次遍歷後的元素名稱(節點名稱)  
        private String tagName;  
          
          
        public List<Student> getList() {  
            return list;  
        }  
      
      
        public void setList(List<Student> list) {  
            this.list = list;  
        }  
      
      
        public Student getStudent() {  
            return student;  
        }  
      
      
        public void setStudent(Student student) {  
            this.student = student;  
        }  
      
      
        public String getTagName() {  
            return tagName;  
        }  
      
      
        public void setTagName(String tagName) {  
            this.tagName = tagName;  
        }  
      
      
        //只調用一次  初始化list集合    
        @Override  
        public void startDocument() throws SAXException {  
            list=new ArrayList<Student>();  
        }  
          
          
        //呼叫多次    開始解析  
        @Override  
        public void startElement(String uri, String localName, String qName,  
                Attributes attributes) throws SAXException {  
            if(qName.equals("student")){  
                student=new Student();  
                //獲取student節點上的id屬性值  
                student.setId(Integer.parseInt(attributes.getValue(0)));  
                //獲取student節點上的group屬性值  
                student.setGroup(Integer.parseInt(attributes.getValue(1)));  
            }  
            this.tagName=qName;  
        }  
          
          
        //呼叫多次    
        @Override  
        public void endElement(String uri, String localName, String qName)  
                throws SAXException {  
            if(qName.equals("student")){  
                this.list.add(this.student);  
            }  
            this.tagName=null;  
        }  
          
          
        //只調用一次  
        @Override  
        public void endDocument() throws SAXException {  
        }  
          
        //呼叫多次  
        @Override  
        public void characters(char[] ch, int start, int length)  
                throws SAXException {  
            if(this.tagName!=null){  
                String date=new String(ch,start,length);  
                if(this.tagName.equals("name")){  
                    this.student.setName(date);  
                }  
                else if(this.tagName.equals("sex")){  
                    this.student.setSex(date);  
                }  
                else if(this.tagName.equals("age")){  
                    this.student.setAge(Integer.parseInt(date));  
                }  
                else if(this.tagName.equals("email")){  
                    this.student.setEmail(date);  
                }  
                else if(this.tagName.equals("birthday")){  
                    this.student.setBirthday(date);  
                }  
                else if(this.tagName.equals("memo")){  
                    this.student.setMemo(date);  
                }  
            }  
        }  
    }  

    使用sax解析xml檔案,有哪些優點和缺點呢?如下所示:

    優點:

    a、不需要等待所有資料都被處理,分析就能立即開始;

    b、只在讀取資料時檢查資料,不需要儲存在記憶體中;

    c、可以在某個條件得到滿足時停止解析,不必解析整個文件;

    d、效率和效能較高,能解析大於系統記憶體的文件。

    缺點:

    a、需要應用程式自己負責TAG的處理邏輯,使用起來比較麻煩;

    b、單向導航,很難同時訪問同一文件的不同部分資料,不支援XPath。

    jdom解析xml檔案

    接著,來介紹jdom解析xml的方式,jdom是一種使用xml的獨特java工具包,她的設計包含java語言的語法乃至語言。  jdom的目的是成為 java特定文件模型,它簡化與xml的互動並且比使用 dom實現更快。由於是第一個 java特定模型,jdom一直得到大力推廣和促進。正在考慮通過“java 規範請求 JSR-102”將它最終用作“Java 標準擴充套件”。從 2000 年初就已經開始了 jdom開發。
    jdom 與 dom 主要有兩方面不同。首先,jdom僅使用具體類而不使用介面。這在某些方面簡化了 API,但是也限制了靈活性。第二,API 大量使用了 Collections 類,簡化了那些已經熟悉這些類的 Java 開發者的使用。
    jdom文件宣告其目的是“使用 20%(或更少)的精力解決 80%(或更多)Java/XML 問題”(根據學習曲線假定為 20%)。jdom 對於大多數 Java/XML 應用程式來說當然是有用的,並且大多數開發者發現 API 比dom 容易理解得多。jdom 還包括對程式行為的相當廣泛檢查以防止使用者做任何在 XML 中無意義的事。然而,它仍需要您充分理解 xml以便做一些超出基本的工作(或者甚至理解某些情況下的錯誤)。這也許是比學習 dom 或 jdom 介面都更有意義的工作。
    jdom自身不包含解析器。它通常使用 SAX2 解析器來解析和驗證輸入 XML 文件(儘管它還可以將以前構造的 dom表示作為輸入)。它包含一些轉換器以將 jdom表示輸出成 SAX2 事件流、dom模型或 xml 文字文件。jdom 是在 Apache 許可證變體下發布的開放原始碼。看下面一個dome,xml檔案如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<prop>
  <mess>
    <property name="sSize" value="52"></property>
    <property name="cSize" value="23"></property>
    <property name="pSize" value="15"></property>
    <property name="aSize" value="25"></property>
  </mess>
</prop>
     使用jdom解析如下所示:
package com.fancy.util;

import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

public class XmlDom {

    public static String obtainValue(String name){
        try {
            //建立一個SAXBuilder物件
              SAXBuilder saxBuilder = new SAXBuilder();            
            //讀取prop.xml資源
              Document doc = saxBuilder.build("prop.xml");
            //獲取根元素(prop)
            Element root = doc.getRootElement();
            //獲取根元素下面的所有子元素(mess)
            List<Element> messList = root.getChildren("mess");
            //子根元素(mess)
            Element childrenRoot = null;
            //property元素集合
              List<Element> propertyList = null;
            //遍歷根元素的子元素集合(即遍歷mess元素)
            for(int i = 0; i < messList.size(); i++){
                 //將根元素prop下的mess子元素作為一個新的子根元素
                   childrenRoot = messList.get(i);
                //獲取子根元素mess下的所有property子元素
                   propertyList = childrenRoot.getChildren("property");
                //遍歷子根元素的子元素集合(即遍歷property元素)
                for(int j = 0; j < propertyList.size(); j++){
                    //獲取property元素
                       Element element = propertyList.get(j);
                    //element.getAttributeValue("name"):獲取property中name屬性的值
                       if(element.getAttributeValue("name").equals(name)){        //如果name的值一致
                          return element.getAttributeValue("value");            //取得name對應的value屬性值
                       }
                }
            }
            //遍歷完沒有查詢到結果返回null
            return null;
        } catch (Exception e) {e.printStackTrace();} 
        return null;
    }
}
複製程式碼

   使用jdom解析xml檔案的方式,具有以下優缺點:      

   優點:

   a、使用具體類而不是介面,簡化了dom的api;

   b、大量使用java集合類,方便了java開發人員。

   缺點:

   a、沒有較好的靈活性;

   b、效能較差。

  小編寄語:博文介紹到這裡,小編已經把四種解析xml檔案的方式介紹完了, JDOM 和 DOM 在效能測試時表現不佳,在測試 10M 文件時記憶體溢位。在小文件情況下還值得考慮使用 DOM 和 JDOM。雖然 JDOM 的開發者已經說明他們期望在正式發行版前專注效能問題,但是從效能觀點來看,它確實沒有值得推薦之處。另外,DOM 仍是一個非常好的選擇。DOM 實現廣泛應用於多種程式語言。它還是許多其它與 XML 相關的標準的基礎,因為它正式獲得 W3C 推薦(與基於非標準的 Java 模型相對),所以在某些型別的專案中可能也需要它(如在 javascript 中使用 DOM)。
    SAX表現較好,這要依賴於它特定的解析方式。一個 SAX 檢測即將到來的XML流,但並沒有載入到記憶體(當然當XML流被讀入時,會有部分文件暫時隱藏在記憶體中)。
    無疑,DOM4J是最好的,目前許多開源專案中大量採用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 來讀取 XML 配置檔案。如果不考慮可移植性,可以採用dom4j,java之路,未完待續。

相關推薦

深入淺出如何解析xml檔案---下篇

    在上篇博文中,小編主要介紹xml的兩種解析方式,分別是dom4j和dom,今天這篇博文,小編主要來簡單介紹一下xml的其她兩種解析方式sax和jdom。    sax解析xml檔案    sax,全稱是Simple API for XML ,即是一種介面,也是一種軟體

深入淺出如何解析xml檔案 下篇

    import java.util.ArrayList;      import java.util.List;                  import org.xml.sax.Attributes;      import org.xml.sax.SAXException;      impo

深入淺出如何解析xml檔案---下篇(轉)

http://blog.csdn.net/u010850027/article/details/51499832 在上篇博文中,小編主要介紹xml的兩種解析方式,分別是dom4j和dom,今天這篇博文,小編主要來簡單介紹一下xml的其她兩種解析方式sax和jd

深入淺出如何解析xml檔案---上篇

    xml小夥伴們並不陌生,xml是可擴充套件標記語言,標準通用標記語言語言的子集,是一種用來標記電子檔案使其具有結構性的標記語言。我們知道xml可以用dom與sax等方法進行解析,但是xml為什麼要解析呢?為什麼html就不用解析?小夥伴們可以思考一下,我們知道xml和

Java上傳且後臺解析XML檔案

後臺程式碼: import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.InputStreamReader; import javax.

利用dom4j-1.6.1解析xml檔案

1.先看xml的文件裡面的格式 2.main裡面,就是一個按鈕新增點選事件,然後通過工具類來解析 3.工具類裡面的程式碼,這裡我在xml中去掉了部分屬性,你可以自己設定一下,然後重新設定就好了 4.最後在activity中就可以自己查看了,我這裡是直接返回了一

java後臺解析XML檔案

解析XML檔案分為兩種: 1、DOM(Document Object Model) 2、SAX(Simple API for XML) DOM是基於XML文件樹結構的解析,SAX是基於事件流的解析。 我用到的是SAX解析>> 一、XML檔案 <?xml

用JDOM解析XML檔案時如何解決中文問題?如何解析

1 import javax.xml.parsers.DocumentBuilder; 2 import javax.xml.parsers.DocumentBuilderFactory; 3 import javax.xml.transform.OutputKeys; 4 import jav

Java:簡單的解析XML檔案之使用DOM解析

XML簡介 要理解XML,HTML等格式,先來理解文件物件模型DOM    根據 DOM,HTML 文件中的每個成分都是一個節點,這些節點組成了一棵樹。DOM 是這樣規定的:整個文件是一個文件節點每個 HTML 標籤是一個元素節點包含在 HTML 元素中的文字是文字節點每一個 HTML 屬性是一個屬性節

java w3c解析xml檔案,獲取指定節點內容,讀取外部配置檔案

原始碼: package com.ys.adage.utils; import com.ys.adage.message.CodeObjectResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.

使用QDomDocument的setContent解析XML檔案報錯的解決方案

可能的錯誤: 1、使用QDomDocument建立根節點時,使用了諸如:rootNode.setAttribute(“ProjName”,fileName);或者rootNode.setAttribute(“Version”,“2.0”);等等,根節點不能帶屬性 2、create

解析.xml檔案

有個第三方的包,用來解析.xml檔案比較方便,它是DOM4J。由於是第三方的,所以要使用它就要先下載,幷包含進來。步驟: 1.開啟dom4j官網,這裡下載最新版dom4j-2.1.1.jar.   2.新建資料夾lib. 3.把下載好的dom4j.jar放到lib資料夾裡面。

使用XmlPullParser解析xml檔案

步驟: 解析類: 1、獲取XmlPullParser解析的例項 2、設定XmlPullParser的引數 3、獲取事件型別,判斷是開始標籤還是結束標籤 4、具體判斷一下解析到哪個開始標籤 5、建立集合物件 6、建立解析物件 7、獲取解析物件內的各標籤的資料並儲存到解析物件中 8、將解析物件的

解析xml檔案動態拼接sql語句

現在有很多開源的持久層框架,比如Mybatis、BeetlSQL、Hibernate、DbUtils。當我們需要自己手寫sql的時候。使用Mybatis、BeetlSQL(這個個人更喜歡,因為結合了hibernate和mybatis各自的優點)框架相對來說更好,因為它將sql 放到配置檔案裡面。

python 使用ElementTree解析xml檔案

以country.xml為例,內容如下: <?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank updated="yes">2</ran

IOS資料處理及版本特性-解析XML檔案

準備一個需要解析的xml檔案 <?xml version="1.0" encoding="UTF-8" ?> <workers>     <worker id='1'>         <n

1.使用dom4j解析xml檔案,模擬伺服器解析web.xml

1. XML文件的構成 XML文件結構其實與html程式碼結構非常相似。 1. XML文件宣告 文件宣告必須以<?xml 開頭,以?>結束。 文件宣告必須從文件的0行0列開始。 文件宣告只有三個屬性: version:指定XML文件版本,必選,一般使用1.0

dom4j解析xml 檔案 並對其操作

程式碼例項 package cn.test.dom4jtest; import java.io.FileOutputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHel

Java解析xml檔案的方式

import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; impo

DocumentBuilderFactory 解析 XML檔案

先看看xml檔案 <?xml version="1.0" encoding="UTF-8"?> <configuration config="user.xml"> <property weburl="www.xzy.com"> <