两个常见的解析xml的思路:
DOM:将文档中所有内容都封装成对象.读取时,将对象都加载到内存中.在内存中创建一棵dom树(记录对象间的关系).
优点: 方便的进行增删改查.
缺点: 会非常消耗内存.
SAX:事件驱动的.把xml文档的 读取过程,划分出5类事件.我们只要提供遇到每类事件做相应的策略实现.
优点:内存占用小.
缺点: 不能进行增删改的操作.
DOM:
把所有内容封装成了5类对象.
document
Element
Attribute
Text
Commons
共同的父类
node
NOde的属性:
自身属性:
nodeType
nodeName
nodeValue
导航属性
找子节点的:firstChild lastChild childNodes
找父节点的:parentNode
找兄弟节点:nextSibling previousSibling
获得Element的方式
getElementById ==> Document
getELementsByTagName ==> Document/Element
getELementsByClassName ==> Document/Element
getElementsByName ==> Document
对于增删改的操作:
创建一个元素: document.createElement
添加一个元素: element.appendChild ,element.insertBefore
替换一个元素: element.replaceChild
删除一个元素: element.removeChild
dom4j中和了上述两种思想,操作xml简单方便,简单联系,源码中包含了相应的参考文档和需要的jar包,需要的可以在这里下载,
package com.qian.demo;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jUtil {
//直接将xml文件已string的形式输出 saxReader.read()--document--document.asXML()
public static void parseAsXml(String filename) throws DocumentException {
InputStream is = Dom4jUtil.class.getClassLoader().getResourceAsStream(filename);
SAXReader reader = new SAXReader();
Document document = reader.read(is);
String xmlContent = document.asXML();
System.out.println(xmlContent);
}
//遍历XML文件
public static void iterateXml(String filename) throws DocumentException{
InputStream is = Dom4jUtil.class.getClassLoader().getResourceAsStream(filename);
SAXReader reader = new SAXReader();
Document document = reader.read(is);
//1.获取根元素
Element root = document.getRootElement();
//2.迭代根元素以下的名字叫student的子元素
for(Iterator<Element> it=root.elementIterator("student");it.hasNext(); ){
Element studentEle = it.next();
//3.获取student元素的number熟悉
String number = studentEle.attributeValue("number");
//4.获取student子元素的内容
String name = studentEle.elementText("name");
String age = studentEle.elementText("age");
String sex = studentEle.elementText("sex");
System.out.println("学号"+number+",姓名:"+name+",年龄:"+age+",性别:"+sex+"");
}
}
//遍历XML文件
public static void listXml(String filename) throws DocumentException{
InputStream is = Dom4jUtil.class.getClassLoader().getResourceAsStream(filename);
SAXReader reader = new SAXReader();
Document document = reader.read(is);
//1.获取根元素
Element root = document.getRootElement();
//2.迭代根元素以下的名字叫student的子元素
List<Element> studentEleList = root.elements("student");
for(Element studentEle:studentEleList){
//3.获取student元素的number熟悉
String number = studentEle.attributeValue("number");
//4.获取student子元素的内容
String name = studentEle.elementText("name");
String age = studentEle.elementText("age");
String sex = studentEle.elementText("sex");
System.out.println("学号"+number+",姓名:"+name+",年龄:"+age+",性别:"+sex+"");
}
}
//增加元素
public static void addElement(String filename,Student stu ) throws DocumentException, IOException{
InputStream is = Dom4jUtil.class.getClassLoader().getResourceAsStream(filename);
SAXReader reader = new SAXReader();
Document document = reader.read(is);
//1.获取根节点
Element root = document.getRootElement();
//2.给根节点元素增加元素并且天津属性
Element studentEle = root.addElement("student").addAttribute("number", stu.getNumber());
//3 添加name age sex 子元素并添加子元素中的文本
studentEle.addElement("name").addText(stu.getName());
studentEle.addElement("age").addText(stu.getAge());
studentEle.addElement("sex").addText(stu.getSex());
//4将document对象会写到文件中,因为上面是把file.xml读到内存行程的dom树
//4.1创建一个格式输出器
OutputFormat format = OutputFormat.createPrettyPrint();
//4.2设置格式输出器的编码也就是说依那种方式写数据
format.setEncoding("utf-8");
String realPath = "src/main/resources/"+filename;
System.out.println(realPath);
XMLWriter writer = new XMLWriter(new FileOutputStream(realPath),format);
writer.write(document);
writer.flush();
writer.close();
}
//删除一个元素,元素的number为0009
public static boolean deleteStudent(String filename,String number) throws Exception{
InputStream is = Dom4jUtil.class.getClassLoader().getResourceAsStream(filename);
SAXReader reader = new SAXReader();
Document document = reader.read(is);
// 1 获得根元素
Element root = document.getRootElement();
// 使用xpath找到我们需要元素
// 定义xpath
String xpath = "//student[@number='"+number+"']";
Element studentEle = (Element) document.selectSingleNode(xpath);
// 删除
boolean b = studentEle.getParent().remove(studentEle);
// 回写
String realPath = "src/main/resources/"+filename;
System.out.println(realPath);
XMLWriter writer = new XMLWriter(new FileOutputStream(realPath),
OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
return b;
}
//修改一个元素,元素的number为0009学生的age变为90;
public static boolean updateStudent(String filename,Student stu) throws Exception{
InputStream is = Dom4jUtil.class.getClassLoader().getResourceAsStream(filename);
SAXReader reader = new SAXReader();
Document document = reader.read(is);
// 1 获得根元素
Element root = document.getRootElement();
// 使用xpath找到我们需要元素
// 定义xpath
String xpath = "//student[@number='"+stu.getNumber()+"']";
Element studentEle = (Element) document.selectSingleNode(xpath);
//修改
studentEle.element("name").setText(stu.getName());
studentEle.element("age").setText(stu.getAge());
studentEle.element("sex").setText(stu.getSex());
// 回写
String realPath = "src/main/resources/"+filename;
XMLWriter writer = new XMLWriter(new FileOutputStream(realPath),
OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
return true;
}
/*public static void main(String[] args) {
try {
parseAsXml("students.xml");
//iterateXml("students.xml");
System.out.println("==========================");
Student stu = new Student();
stu.setNumber("0009");
stu.setName("张三");
stu.setAge("20");
stu.setSex("male");
addElement("students.xml", stu);
System.out.println("==========================");
Thread.sleep(100);
listXml("students.xml");
//deleteStudent("students.xml", "0009");
Student stu2 = new Student();
stu.setNumber("0009");
stu.setName("李四");
stu.setAge("20");
stu.setSex("female");
updateStudent("students.xml", stu2);
} catch (Exception e) {
e.printStackTrace();
}
}*/
}