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(); } )