程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java解析xml的四種辦法匯總

Java解析xml的四種辦法匯總

編輯:關於JAVA

Java解析xml的四種辦法匯總。本站提示廣大學習愛好者:(Java解析xml的四種辦法匯總)文章只能為提供參考,不一定能成為您想要的結果。以下是Java解析xml的四種辦法匯總正文


1. DOM(JAXP Crimson解析器)

DOM是用與平台和說話有關的方法表現XML文檔的官方W3C尺度。DOM是以條理構造組織的節點或信息片段的聚集。這個條理構造許可開辟人員在樹中尋覓特定信息。剖析該構造平日須要加載全部文檔和結構條理構造,然後能力做任何任務。因為它是基於信息條理的,因此DOM被以為是基於樹或基於對象的。DOM和狹義的基於樹的處置具有幾個長處。起首,因為樹在內存中是耐久的,是以可以修正它以便運用法式能對數據和構造作出更改。它還可以在任什麼時候候在樹中高低導航,而不是像SAX那樣是一次性的處置。DOM應用起來也要簡略很多。

2. SAX

SAX處置的長處異常相似於流媒體的長處。剖析可以或許立刻開端,而不是期待一切的數據被處置。並且,因為運用法式只是在讀取數據時檢討數據,是以不須要將數據存儲在內存中。這關於年夜型文檔來講是個偉大的長處。現實上,運用法式乃至不用解析全部文檔;它可以在某個前提獲得知足時停滯解析。普通來講,SAX還比它的替換者DOM快很多。

選擇DOM照樣選擇SAX? 關於須要本身編寫代碼來處置XML文檔的開辟人員來講, 選擇DOM照樣SAX解析模子是一個異常主要的設計決議計劃。 DOM采取樹立樹形構造的方法拜訪XML文檔,而SAX采取的事宜模子。

DOM解析器把XML文檔轉化為一個包括其內容的樹,並可以對樹停止遍歷。用DOM解析模子的長處是編程輕易,開辟人員只須要挪用建樹的指令,然後應用navigation APIs拜訪所需的樹節點來完成義務。可以很輕易的添加和修正樹中的元素。但是因為應用DOM解析器的時刻須要處置全部XML文檔,所以對機能和內存的請求比擬高,特別是碰到很年夜的XML文件的時刻。因為它的遍歷才能,DOM解析器經常使用於XML文檔須要頻仍的轉變的辦事中。

SAX解析器采取了基於事宜的模子,它在解析XML文檔的時刻可以觸發一系列的事宜,當發明給定的tag的時刻,它可以激活一個回調辦法,告知該辦法制訂的標簽曾經找到。SAX對內存的請求平日會比擬低,由於它閃開發人員本身來決議所要處置的tag.特殊是當開辟人員只須要處置文檔中所包括的部門數據時,SAX這類擴大才能獲得了更好的表現。但用SAX解析器的時刻編碼任務會比擬艱苦,並且很難同時拜訪統一個文檔中的多處分歧數據。

3. JDOM http://www.jdom.org

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允許證變體下宣布的開放源碼。

4. DOM4J http://dom4j.sourceforge.net

固然DOM4J代表了完整自力的開辟成果,但最後,它是JDOM的一種智能分支。它歸並了很多超越根本XML文檔表現的功效,包含集成的XPath支撐、XML Schema支撐和用於年夜文檔或流化文檔的基於事宜的處置。它還供給了構建文檔表現的選項,它經由過程DOM4J API和尺度DOM接口具有並行拜訪功效。從2000下半年開端,它就一向處於開辟當中。

為支撐一切這些功效,DOM4J應用接口和籠統根本類辦法。DOM4J年夜量應用了API中的Collections類,然則在很多情形下,它還供給一些替換辦法以許可更好的機能或更直接的編碼辦法。直接利益是,固然DOM4J支付了更龐雜的API的價值,然則它供給了比JDOM年夜很多的靈巧性。

在添加靈巧性、XPath集成和對年夜文檔處置的目的時,DOM4J的目的與JDOM是一樣的:針對Java開辟者的易用性和直不雅操作。它還努力於成為比JDOM更完全的處理計劃,完成在實質上處置一切Java/XML成績的目的。在完成該目的時,它比JDOM更少強調避免不准確的運用法式行動。

DOM4J是一個異常異常優良的Java XML API,具有機能優良、功效壯大和極端易用應用的特色,同時它也是一個開放源代碼的軟件。現在你可以看到愈來愈多的Java軟件都在應用DOM4J來讀寫XML,特殊值得一提的是連Sun的JAXM也在用DOM4J.
關於四中辦法的比擬

DOM4J機能最好,連Sun的JAXM也在用DOM4J.今朝很多開源項目中年夜量采取DOM4J,例如年夜名鼎鼎的Hibernate也用DOM4J來讀取XML設置裝備擺設文件。假如不斟酌可移植性,那就采取DOM4J.
JDOM和DOM在機能測試時表示欠安,在測試10M文檔時內存溢出。在小文檔情形下還值得斟酌應用DOM和JDOM.固然JDOM的開辟者曾經解釋他們希冀在正式刊行版前專注機能成績,然則從機能不雅點來看,它確切沒有值得推舉的地方。別的,DOM還是一個異常好的選擇。DOM完成普遍運用於多種編程說話。它照樣很多其它與XML相干的尺度的基本,由於它正式取得W3C推舉(與基於非尺度的Java模子絕對),所以在某些類型的項目中能夠也須要它(如在JavaScript中應用DOM)。
SAX表示較好,這要依附於它特定的解析方法-事宜驅動。一個SAX檢測行將到來的XML流,但並沒有載入到內存(固然當XML流被讀入時,會有部門文檔臨時隱蔽在內存中)。

四種xml操作方法的根本應用

xml文件:

<?xml version="1.0" encoding="GB2312"?>
<RESULT>
<VALUE>
   <NO>A1234</NO>
   <ADDR>四川省XX縣XX鎮XX路X段XX號</ADDR>
</VALUE>
<VALUE>
   <NO>B1234</NO>
   <ADDR>四川省XX市XX鄉XX村XX組</ADDR>
</VALUE>
</RESULT>

1)DOM完成辦法

import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class MyXMLReader{
 public static void main(String arge[]){
  long lasting =System.currentTimeMillis();
  try{
   File f=new File("data_10k.xml");
   DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
   DocumentBuilder builder=factory.newDocumentBuilder();
   Document doc = builder.parse(f);
   NodeList nl = doc.getElementsByTagName("VALUE");
   for (int i=0;i<nl.getLength();i++){
    System.out.print("車商標碼:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
    System.out.println("車主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
   }
  }catch(Exception e){
   e.printStackTrace();
}

2)SAX完成辦法

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class MyXMLReader extends DefaultHandler {
 java.util.Stack tags = new java.util.Stack();
 public MyXMLReader() {
  super();
}
 public static void main(String args[]) {
  long lasting = System.currentTimeMillis();
  try {
   SAXParserFactory sf = SAXParserFactory.newInstance();
   SAXParser sp = sf.newSAXParser();
   MyXMLReader reader = new MyXMLReader();
   sp.parse(new InputSource("data_10k.xml"), reader);
  } catch (Exception e) {
   e.printStackTrace();
  }

  System.out.println("運轉時光:" + (System.currentTimeMillis() - lasting) + "毫秒");}
  public void characters(char ch[], int start, int length) throws SAXException {
  String tag = (String) tags.peek();
  if (tag.equals("NO")) {
   System.out.print("車商標碼:" + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
  System.out.println("地址:" + new String(ch, start, length));
}
}

  public void startElement(String uri,String localName,String qName,Attributes attrs) {
  tags.push(qName);}
}

3)JDOM完成辦法

import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class MyXMLReader {
 public static void main(String arge[]) {
  long lasting = System.currentTimeMillis();
  try {
   SAXBuilder builder = new SAXBuilder();
   Document doc = builder.build(new File("data_10k.xml"));
   Element foo = doc.getRootElement();
   List allChildren = foo.getChildren();
   for(int i=0;i<allChildren.size();i++) {
    System.out.print("車商標碼:" + ((Element)allChildren.get(i)).getChild("NO").getText());
    System.out.println("車主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
   }
  } catch (Exception e) {
   e.printStackTrace();
}

}

4)DOM4J完成辦法

import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;

public class MyXMLReader {

 public static void main(String arge[]) {
  long lasting = System.currentTimeMillis();
  try {
   File f = new File("data_10k.xml");
   SAXReader reader = new SAXReader();
   Document doc = reader.read(f);
   Element root = doc.getRootElement();
   Element foo;
   for (Iterator i = root.elementIterator("VALUE"); i.hasNext() {
    foo = (Element) i.next();
    System.out.print("車商標碼:" + foo.elementText("NO"));
    System.out.println("車主地址:" + foo.elementText("ADDR"));
   }
  } catch (Exception e) {
   e.printStackTrace();
}
)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved