java解析xml⽂件四种⽅式
1.介绍
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
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
虽然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县XX镇XX路X段XX号</ADDR>
</VALUE>
<VALUE>
<NO>B1234</NO>
<ADDR>四川省XX市XX乡XX村XX组</ADDR>
</VALUE>
</RESULT>
1)DOM
package MyXMLReader;
import java.io.File;
l.parsers.DocumentBuilder;
l.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
public class MyXMLReaderDOM {
public static void main(String arge[]) {
long startTime = System.currentTimeMillis();
try {
File f = new File("l");
DocumentBuilderFactory factory = DocumentBuilderFactory
.
newInstance();
DocumentBuilder builder = wDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = ElementsByTagName("VALUE");
for (int i = 0; i < nl.getLength(); i++) {
System.out.print("车牌号码:"
+ ElementsByTagName("NO").item(i)
.getFirstChild().getNodeValue());
System.out.println("车主地址:"
+ ElementsByTagName("ADDR").item(i)
.getFirstChild().getNodeValue());
}
} catch (Exception e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
long useTime = endTime - startTime;
System.out.println("Time consumption: " + useTime + "ms.");
}
}
2)SAX
package MyXMLReader;
l.parsers.SAXParser;
l.parsers.SAXParserFactory;
l.sax.Attributes;
l.sax.InputSource;
l.sax.SAXException;
l.sax.helpers.DefaultHandler;
public class MyXMLReaderSAX extends DefaultHandler {
java.util.Stack tags = new java.util.Stack();
public MyXMLReaderSAX() {
super();
}
public static void main(String args[]) {
long startTime = System.currentTimeMillis();
try {
SAXParserFactory sf = wInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReaderSAX reader = new MyXMLReaderSAX();
sp.parse(new InputSource("l"), reader);
} catch (Exception e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
long useTime = endTime - startTime;
System.out.println("Time consumption: " + useTime + "ms.");
}
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
package MyXMLReader;
import java.io.File;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
public class MyXMLReaderJDOM {
public static void main(String arge[]) {
long startTime = System.currentTimeMillis();
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File("l"));            Element foo = RootElement();
List allChildren = Children();
for (int i = 0; i < allChildren.size(); i++) {
System.out.print("车牌号码:"
+ ((Element) (i)).getChild("NO")
.getText());
System.out.println("车主地址:"
+ ((Element) (i)).getChild("ADDR")
.getText());
}
} catch (Exception e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
long useTime = endTime - startTime;
System.out.println("Time consumption: " + useTime + "ms.");
}
}
4)DOM4J
package MyXMLReader;
import java.io.File;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class MyXMLReaderDOM4J {
java xml是什么
public static void main(String arge[]) {
long startTime = System.currentTimeMillis();
try {
File file = new File("l");
SAXReader reader = new SAXReader();
Document doc = ad(file);
Element root = RootElement();
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();
}
long endTime = System.currentTimeMillis();
long useTime = endTime - startTime;
System.out.println("Time consumption: " + useTime + "ms.");
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。