旗下导航:搜·么
当前位置:网站首页 > XML教程 > 正文

剖析XML文件的几种体式格局对照的细致引见【XML教程】,XML文件,对比

作者:搜教程发布时间:2019-12-01分类:XML教程浏览:39评论:0


导读:事情中经常须要用到剖析XML文件、头几天口试被问到了一些扩大学问,大跌眼镜。没有回覆的让人惬意、特此纪录进修一下。特性:DOM须要一次性载入XML文件到内存。SAX不...
事情中经常须要用到剖析XML文件、头几天口试被问到了一些扩大学问,大跌眼镜。没有回覆的让人惬意、特此纪录进修一下。

特性: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网别的相干文章!

标签:XML文件对比


欢迎 发表评论: