1、基础认知
解析XML的两种方式:DOM和SAX。DOM,document object model,该种方式采取将XML文档解析成内存中的document对象,从而产生其对应的优缺点,很容易对XML进行CRUD,由于需要将XML全部解析进内存从而不能处理数据量很大的文档,易发生内存崩溃。SAX,Simple API for XML,该方式不将文档全部解析成内存中的document,从而只能进行读取操作,解析速度快,内存占用小。只需要对XML读取数据时,可采用SAX方式,如需进行CRUD,则只能用DOM方式。
两种开发包:JAXP和Dom4j。JAXP是sun公司的官方开发包,Dom4j是开发中实际广泛使用的开发包。JAXP的开发效率不如Dom4j。由于JAXP是sun官方发布,需要了解。而实际开发采用的是Dom4j。
2、Dom4j
2.1 导入开发包:
dom4j.jar、jaxen-beta.jar
2.2 Demo
package com.zpc.xml;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
public class Dom4jDemo {
//得到内存中document对象
public Document getDocument() throws Exception{
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("src/grade.xml"));
return doc;
}
//将内存中操作后的document写入到XML文件中去
public void write2Xml(Document doc) throws Exception{
OutputFormat format = new OutputFormat();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/grade.xml")),format);
writer.write(doc);
writer.close();
}
//添加节点
@Test
public void create() throws Exception{
Document doc = this.getDocument();
Element student = DocumentHelper.createElement("student");
student.addAttribute("name","wmy");
Element grade = DocumentHelper.createElement("grade");
grade.setText("100");
Element age = DocumentHelper.createElement("age");
age.setText("20");
student.add(grade);
student.add(age);
Element root = doc.getRootElement();
root.add(student);
this.write2Xml(doc);
}
//读取节点数据
@Test
public void read() throws Exception{
Document doc = this.getDocument();
Element root = doc.getRootElement();
Node gradeNode = root.selectSingleNode("//student[@name='wmy']/grade");//其中"//student[@name='wmy']/grade"为XPath中的知识点
String grade = gradeNode.getText();
System.out.println("the grade is "+grade+" .");
}
//更新节点数据
@Test
public void update() throws Exception{
Document doc = this.getDocument();
Node ageNode = doc.selectSingleNode("//student[@name='wmy']/age");
ageNode.setText("18");
this.write2Xml(doc);
}
//删除节点
@Test
public void delete() throws Exception{
Document doc = this.getDocument();
Node student = doc.selectSingleNode("//student[@name='wmy']");
student.getParent().remove(student);
this.write2Xml(doc);
}
}
3、XPath
XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。
这里给出简易的两个案例:
/*获取所有foo下的bar节点*/
//foo/bar
/*获取foo下id属性为aa的bar节点*/
//foo/bar[@id=’aa‘]
4、总结
通过XPath和Dom4j的结合使用,可以获取XML文档中任意节点元素信息,是处理解析XML数据需求的很好的方式。