1.SAX解析(Simple API for XML)
SAX解析方式:逐行扫描文档,一遍扫描一遍解析。相比于DOM,SAX可以在解析文档的任意时刻停止解析解析,是一种速度更快,更高效的方法。
优点:解析可以立即开始,速度快,没有内存压力
缺点:不能对结点做修改
适用:读取XML文件
-
package cn.tedu;
-
import java.util.ArrayList;
-
import java.util.List;
-
import org.dom4j.Document;
-
import org.dom4j.DocumentException;
-
import org.dom4j.Element;
-
import org.dom4j.io.SAXReader;
-
import cn.tedu.entity.Emp;
-
/**
-
* 解析XML文档
-
*
-
*/
-
public class XMLReader {
-
public static void main(String[] args) {
-
SAXReader reader = new SAXReader() ;
-
try {
-
Document doc = reader.read("emplist.xml") ;
-
//获取根元素
-
Element root = doc.getRootElement() ;
-
System.out.println(root.getName()) ;
-
//获取子元素
-
List<Element> list = root.elements() ;
-
//用于保存雇员信息
-
List<Emp> emps = new ArrayList<Emp>() ;
-
for (Element e : list) {
-
//获取属性
-
String id = e.attributeValue("id") ;
-
String name = e.elementText("name") ;
-
int age = Integer.parseInt(e.elementText("age")) ;
-
String gender = e.elementText("gender") ;
-
double salary = new Double(e.elementText("salary")) ;
-
Emp emp = new Emp(id, name, age, gender, salary) ;
-
emps.add(emp) ;
-
}
-
//遍历emps
-
for (Emp emp : emps) {
-
System.out.println(emp) ;
-
}
-
} catch (DocumentException e) {
-
e.printStackTrace() ;
-
System.err.println("文档解析失败");
-
}
-
}
-
}
2.DOM解析(Document Object Model)
DOM解析方式:DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)
优点:把XML文件在内存中构建属性结构,可以遍历和修改节点。
缺点:如果文件比较大,内存有压力,解析的时间会比较长。
适用:修改XML数据
3.DOM4J
DOM4J有更复杂的api,所以dom4j比jdom有更大的灵活性.DOM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.
优点:灵活性最高、易用性和功能强大、性能优异
缺点:复杂的api、移植性差
适用:自行选择
-
package cn.tedu;
-
import java.io.FileNotFoundException;
-
import java.io.FileOutputStream;
-
import java.io.IOException;
-
import java.io.UnsupportedEncodingException;
-
import java.util.ArrayList;
-
import java.util.List;
-
import org.dom4j.Document;
-
import org.dom4j.DocumentHelper;
-
import org.dom4j.Element;
-
import org.dom4j.io.OutputFormat;
-
import org.dom4j.io.XMLWriter;
-
import cn.tedu.entity.Emp;
-
/**
-
* 创建XML文档
-
*
-
*/
-
public class CreateXml {
-
public static void main(String[] args) {
-
//1.创建一个空文档对象Document
-
Document doc = DocumentHelper.createDocument() ;
-
//2.像Document对象中添加根元素
-
Element root =doc.addElement("emplist") ;
-
//3.按照预定的格式依次向根元素中添加子元素来完成文档结构
-
//创建雇员信息
-
List<Emp> list = new ArrayList<Emp>() ;
-
Emp emp1 = new Emp("13" , "张三" , 14 , "男" , 9000.0) ;
-
Emp emp2 = new Emp("14" , "李四" , 14 , "女" , 8000.0) ;
-
list.add(emp1) ;
-
list.add(emp2) ;
-
//添加子元素
-
for (Emp e : list) {
-
Element emp = root.addElement("emp") ;
-
emp.addAttribute("id" , e.getId()) ;
-
emp.addElement("name").addText(e.getName()) ;
-
emp.addElement("age").addText(e.getAge()+"") ;
-
emp.addElement("gender").addText(e.getGender()) ;
-
emp.addElement("salary").addText(e.getSalary()+"") ;
-
}
-
//4.创建XMLWriter
-
XMLWriter writer = null ;
-
try {
-
writer = new XMLWriter(OutputFormat.createPrettyPrint()) ;
-
writer.setOutputStream(new FileOutputStream("myemp.xml")) ;
-
//5.将Document通过XMLWriter写成XML文档
-
writer.write(doc) ;
-
System.out.println("生成完毕!");
-
} catch (UnsupportedEncodingException e1) {
-
e1.printStackTrace();
-
} catch (FileNotFoundException e1) {
-
e1.printStackTrace();
-
} catch (IOException e1) {
-
e1.printStackTrace();
-
} finally {
-
if(writer != null) {
-
try {
-
writer.close() ;
-
} catch (IOException e1) {
-
e1.printStackTrace();
-
}
-
}
-
}
-
}
-
}
4.JDOM
JDOM是处理xml的纯java api.使用具体类而不是接口.JDOM具有树的遍历,又有SAX的java规则.JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。
JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。
优点:1、是基于树的处理xml的java api,把树加载到内存中.
2、没有向下兼容的限制,所以比DOM简单.
3、速度快.
4、具有SAX的java 规则.
缺点:1、不能处理大于内存的文档.
2、JDOM表示XML文档逻辑模型,不能保证每个字节真正变换.
3、 针对实例文档不提供DTD与模式的任何实际模型.
4、 不支持于DOM中相应遍历包.
适用:自行选择
--------------------- 作者:Hero_Ant 来源:CSDN 原文:https://blog.csdn.net/sinat_27170093/article/details/54173090?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!