特性:DOM须要一次性载入XML文件到内存。
SAX不须要一次性载入,剖析能够马上最先,而不是守候一切的数据被处置惩罚。
JDOM 大批运用了Java的鸠合对象,大大提高了Java顺序员的事情效率28准绳。
DOM4J 现在来讲用的最多,我们的项目也是在用DOM4j来剖析。
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 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 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.
2…… 比较
1)DOM4J机能最好,连Sun的JAXM也在用DOM4J.现在很多开源项目中大批采纳DOM4J,比方赫赫有名的Hibernate也用DOM4J来读取XML配置文件。假如不斟酌可移植性,那就采纳DOM4J.
2)JDOM和DOM在机能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得斟酌运用DOM和JDOM.虽然JDOM的开辟者已申明他们希冀在正式发行版前专注机能题目,然则从机能看法来看,它确切没有值得引荐的地方。别的,DOM还是一个异常好的挑选。DOM完成普遍应用于多种编程言语。它照样很多别的与XML相干的范例的基本,由于它正式取得W3C引荐(与基于非范例的Java模子相对),所以在某些范例的项目中能够也须要它(如在JavaScript中运用DOM)。
3)SAX表现较好,这要依赖于它特定的剖析体式格局-事宜驱动。一个SAX检测行将到来的XML流,但并没有载入到内存(固然当XML流被读入时,会有部份文档临时隐蔽在内存中)。
3. 四种xml操纵体式格局的基本运用要领
xml文件:
<?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> <NO>A1234</NO> <ADDR>XX号</ADDR> </VALUE> <VALUE> <NO>B1234</NO> <ADDR>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(); } )
以上就是剖析XML文件的几种体式格局对照的细致引见的细致内容,更多请关注ki4网别的相干文章!