JAVA解析xml的四種方式比較

来源:http://www.cnblogs.com/lq147760524/archive/2017/04/17/6725110.html
-Advertisement-
Play Games

<!-- 占用一個節點對象 --><province> <city code="027">武漢</city> <city code="0716">荊州</city> <city code="0718">宜昌</city></province><!-- 占用第三個節點對象 --> JAVA代碼如下: ...


1)DOM解析
	DOM是html和xml的應用程式介面(API),以層次結構(類似於樹型)來組織節點和信息片段,映射XML文檔的結構,允許獲取
和操作文檔的任意部分,是W3C的官方標準
【優點】
①允許應用程式對數據和結構做出更改。
②訪問是雙向的,可以在任何時候在樹中上下導航,獲取和操作任意部分的數據。
【缺點】
①通常需要載入整個XML文檔來構造層次結構,消耗資源大。
以下實例採用這個XML文件內容,例如(demo.xml)

<!-- 占用一個節點對象 -->
<province>
<city code="027">武漢</city>
<city code="0716">荊州</city>
<city code="0718">宜昌</city>
</province>
<!-- 占用第三個節點對象 -->

JAVA代碼如下:

//使用前請先導入w3c-dom.jar包。省略導入步驟。

//註意,DOM解析時會將註釋部分和空格換行讀入子節點中,註意check。

package com.phone1000.lq.xml_demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

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

/**
 * @author lq
 *XML文件內容讀取,轉換成流,然後轉換成對應的子節點類型字元串。
 */
public class Xml_demo {
    private static final String PROVINCE="province";
    public static void main(String[] args) {
        
        try {
            FileInputStream fin=new FileInputStream(new File("src/demo.xml"));
             DocumentBuilderFactory docFac=DocumentBuilderFactory.newInstance();
             DocumentBuilder builder=docFac.newDocumentBuilder();
             //解析流
             Document doc= builder.parse(fin);
             NodeList docNodePar=doc.getChildNodes();
             //獲取父節點長度
             int parNum=docNodePar.getLength();
             System.out.println(parNum);
             for(int i=0;i<parNum;i++){
                 Node parNode= docNodePar.item(i);
                 System.out.println(parNode.getNodeName());
                 if(PROVINCE.equals(parNode.getNodeName())){
                     NodeList childNode= parNode.getChildNodes();
                     
                    int childNum= childNode.getLength();
                     for(int j=0;j<childNum;j++){
                         Node childNodeName=childNode.item(j);
                         if(childNodeName.hasAttributes()){
                             NamedNodeMap childNode_child= childNodeName.getAttributes();
                            Node childNode_childNode=childNode_child.getNamedItem("code");
                            String codeStr=childNode_childNode.getNodeValue();
                            String text= childNodeName.getTextContent();
                            System.out.println(codeStr+"\t"+text);
                         }
                     }
                 }
             }
        } catch (ParserConfigurationException | SAXException | IOException e) {
            //
            e.printStackTrace();
        }
        
    }

}
View Code

 

(2)SAX解析XML
流模型中的"推"模型分析方式。通過事件驅動,每發現一個節點就引發一個事件,事件推給事件處理器,通過回調方法
完成解析工作,解析XML文檔的邏輯需要應用程式完成
【優勢】
①不需要等待所有數據都被處理,分析就能立即開始。
②只在讀取數據時檢查數據,不需要保存在記憶體中。
③可以在某個條件得到滿足時停止解析,不必解析整個文檔。
④效率和性能較高,能解析大於系統記憶體的文檔。
【缺點】
①需要應用程式自己負責TAG的處理邏輯(例如維護父/子關係等),文檔越複雜程式就越複雜。
②單嚮導航,無法定位文檔層次,很難同時訪問同一文檔的不同部分數據,不支持XPath。
以下實例採用這個XML文件內容,例如(demo.xml)

<!-- 占用一個節點對象 -->
<province>
<city code="027">武漢</city>
<city code="0716">荊州</city>
<city code="0718">宜昌</city>
</province>
<!-- 占用第三個節點對象 -->

JAVA代碼如下:

//使用前請先導入sax.jar包。省略導入步驟。

//此處創建內部類重寫了DefaultHandler的startDocument(),endDocument(),startElement(),endElement() ,characters(),五種方法。

//註意,SAX解析時會將註釋部分和空格換行讀入子節點中。所以要check。

package com.phone1000.lq.xml_sax;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * @author lq
 *另一種XML解析方法,記憶體占用少
 */
public class Xml_Sax {
    private static List<CityList> list=new ArrayList<>();
    public static void execute() throws Exception{
        FileInputStream fiin=new FileInputStream(new File("src/demo.xml"));
        SAXParserFactory saxF=SAXParserFactory.newInstance();
        SAXParser saxP=saxF.newSAXParser();
        saxP.parse(fiin, new myHandler());
        
        for(CityList city:list){
            System.out.println(city.getName());
        }
    }
    static class myHandler extends  DefaultHandler{
        private CityList citylist;
        @Override
        public void startDocument() throws SAXException {
            System.out.println("開始標簽");
        }

        @Override
        public void endDocument() throws SAXException {
            System.out.println("結束標簽");
        }

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes)
                throws SAXException {
            String attr=attributes.getValue("code");
            if("city".equals(qName)){
                citylist=new CityList();
                citylist.setCode(attr);
            }
        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            if("city".equals(qName)){
                list.add(citylist);
            }
            citylist=null;
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            String str=new String(ch,start,length);
            System.out.println(str);
            if(citylist != null){
                citylist.setName(str);
            }
        }
        
    }
}
View Code
package com.phone1000.lq.xml_sax;

public class CityList {
    String name;
    String code;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public CityList(String name, String code) {
        super();
        this.name = name;
        this.code = code;
    }
    public CityList() {
        super();
        // TODO Auto-generated constructor stub
    }
    @Override
    public String toString() {
        return "CityList [name=" + name + ", code=" + code + "]";
    }
    
}
View Code
package com.phone1000.lq.xml_sax;

public class TsetSax {

    public static void main(String[] args) {
        try {
            Xml_Sax.execute();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
View Code

 

(3)JDOM解析XML
Java特定的文檔對象模型。自身不包含解析器,使用SAX
【優點】
①使用具體類而不是介面,簡化了DOM的API。
②大量使用了Java集合類,方便了Java開發人員。
【缺點】
①沒有較好的靈活性。
②性能較差。
以下實例採用這個XML文件內容,例如(demo2.xml)

<beans>
<bean name="demo">demo.java</bean>
<bean name="home">home.java</bean>
<bean name="index">index.java</bean>
</beans>

JAVA代碼如下:

//使用前請先導入jdom.jar包,省略導入步驟。

//註意,jdom解析時會跳過註釋部分和空格換行內容。

package com.phone1000.lq.jdom;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class Xml_Jdom {
  public static void main(String[] args) {
  try {
    SAXBuilder builder=new SAXBuilder(false);
    FileInputStream fin=new FileInputStream(new File("src/demo2.xml"));
    Document doc=builder.build(fin);
    Element ele=doc.getRootElement();
    String str=ele.getName();
    System.out.println(str);
    @SuppressWarnings("unchecked")
    List<Element> list=ele.getChildren();
    for (Element element : list) {
      System.out.println(element.getAttributeValue("name")+"\t"+element.getText());
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (JDOMException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
View Code

 

(4)DOM4J解析XML
簡單易用,採用Java集合框架,並完全支持DOM、SAX和JAXP
【優點】
①大量使用了Java集合類,方便Java開發人員,同時提供一些提高性能的替代方法。
②支持XPath。
③有很好的性能。
【缺點】
①大量使用了介面,API較為複雜。
以下實例採用這個XML文件內容,例如(demo2.xml)

<beans>
<bean name="demo">demo.java</bean>
<bean name="home">home.java</bean>
<bean name="index">index.java</bean>
</beans>

JAVA代碼如下:

//使用前請先導入dom4j.jar包,省略導入步驟。

//註意,dom4j解析時會跳過註釋部分和空格換行內容,直接獲得節點內容。

 1 package com.phone1000.lq.dom4j;
 2 
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.util.List;
 7 
 8 import org.dom4j.Document;
 9 import org.dom4j.DocumentException;
10 import org.dom4j.Element;
11 import org.dom4j.io.SAXReader;
12 
13 public class Xml_dom4j {
14   public static void main(String[] args) {
15   try {
16     SAXReader sax=new SAXReader();
17     FileInputStream fin=new FileInputStream(new File("src/demo2.xml"));
18     Document doc=sax.read(fin);
19     Element ele=doc.getRootElement();
20     String str=ele.getName();
21     System.out.println(str);
22     @SuppressWarnings("unchecked")
23     List<Element> list=ele.elements();
24     for (Element element : list) {
25       System.out.println(element.attributeValue("name")+"\t"+element.getText());
26       }
27     } catch (FileNotFoundException | DocumentException e) {
28       e.printStackTrace();
29     }
30   }
31 }
View Code

 

附加StAX解析XML
流模型中的拉模型分析方式。提供基於指針和基於迭代器兩種方式的支持,JDK1.6新特性
【和推式解析相比的優點】
①在拉式解析中,事件是由解析應用產生的,因此拉式解析中向客戶端提供的是解析規則,而不是解析器。
②同推式解析相比,拉式解析的代碼更簡單,而且不用那麼多庫。
③拉式解析客戶端能夠一次讀取多個XML文件。
④拉式解析允許你過濾XML文件和跳過解析事件。
【簡介】
StAX API的實現是使用了Java Web服務開發(JWSDP)1.6,並結合了Sun Java流式XML分析器(SJSXP)-它位於
javax.xml.stream包中。XMLStreamReader介面用於分析一個XML文檔,而XMLStreamWriter介面用於生成一個
XML文檔。XMLEventReader負責使用一個對象事件迭代子分析XML事件-這與XMLStreamReader所使用的游標機制
形成對照。
 
 
 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • struts編寫文件下載的代碼 配置struts.xml文件 創建Action類 jsp代碼 在運行中可能遇到的錯誤!!!!! 1、下載文件的文件名顯示成xxx.action或者不是下載文件本來的文件名 可能是獲取文件名的getFileName方法沒有大寫 可能是getFileName方法直接返回f ...
  • web.xml的作用: 1.配置JSP,Servlet,Listener,Filter,標簽庫,JSP屬性 2.配置JAAS授權認證,資源應用,web首頁設置JSP的本質是Servlet(web應用中每個JSP頁面都會由Servlet容器生成對應的Servlet)JSP包括靜態的html頁面代碼和動 ...
  • 訪問控制 public(公開的):可以在類中、子類中、類外訪問。 protected(受保護的):只能在類本身及子類中訪問。 private(私有的):只能在聲明他們的類中進行訪問,私有的類成員不能被子類或者這個類的對象實例直接訪問。 抽象類和方法 在繼承概念被應用在一些場景中,創建一個父類的實例將 ...
  • 下麵說的線性表主要是線性鏈表,這裡主要將雙向鏈表,單向鏈表迴圈鏈表等是類似的,不再累述。如果發現錯誤,還望不吝指正。 定義 線性表(linear list)是數據結構的一種,一個線性表是n個具有相同特性的數據元素的有限序列。數據元素是一個抽象的符號,其具體含義在不同的情況下一般不同。 在稍複雜的線性 ...
  • 如何個判斷集合中是否存在某個元素——contains() 1.List的contains(obj)方法 實際上,List調用contains(Object obj)方法時,會遍歷List中的每一個元素,然後再調用每個元素的equals()方法去跟contains()方法中的參數進行比較,如果有一個元 ...
  • 問題描述:一進程剛獲得三個主存塊的使用權,若該進程訪問頁面的次序是1,2,3,4,1,2,5,1,2,3,4,5。當採用LRU演算法時,發生的缺頁次數是多少? Hint:LRU(Least Recently Used)意思是近期最少使用。 這個演算法常用於頁面置換演算法中。當我們新要訪問的頁面不在主存中時 ...
  • 使用toPlainString意為返回不不待指數的字元串 與toString區別當數據的位數為0的時候,使用toString就會出現無法正的的轉化的問題。 所以在處理科學計數法是不適用toString而是toPlainString,避免偶發錯誤發生。 ...
  • 一、模塊的認識。 模塊:指的是把預先寫好的內容封裝成一個模塊,可用時直接調用,模塊又稱為庫 模塊又稱為標準庫和第三方庫。 標準庫,預設安裝好官方所公佈的庫 C:\Python35\Lib 第三方庫,是從網上下載下來需要安裝上去。C:\Python35\Lib\site-packages getpas ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...