一 简介
XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析
本文介绍使用org.w3c.dom解析XML
简单来说:就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述。
优点:
1、形成了树结构,有助于更好的理解、掌握,且代码容易编写。
2、解析过程中,树结构保存在内存中,方便修改。
缺点:
1、由于文件是一次性读取,所以对内存的耗费比较大。
2、如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。
首先介绍下Java DOM 的 API:
1.解析器工厂类:DocumentBuilderFactory
创建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
2.解析器:DocumentBuilder
创建方法:通过解析器工厂类来获得 DocumentBuilder db = dbf.newDocumentBuilder();
3.文档树模型Document
创建方法:a.通过xml文档
Document doc = db.parse("bean.xml");
b.将需要解析的xml文档转化为输入流
InputStream is = new FileInputStream("bean.xml");
Document doc = db.parse(is);
然后介绍下常用对象:
1.Document对象
代表了一个XML文档的模型树,所有的其他Node都以一定的顺序包含在Document对象之内,排列成一个树状结构,以后对XML文档的所有操作都与解析器无关,直接在这个Document对象上进行操作即可;
包含了很多getXXX(),setXX(),createXX()。
2.Node对象
是DOM中最基本的对象,代表了文档树中的抽象节点。但在实际使用中很少会直接使用Node对象,而是使用Node对象的子对象Element,Attr,Text等
3.元素类Element
是Node类最主要的子对象,在元素中可以包含属性,因而Element中有存取其属性的方法
4.属性类Attr
代表某个元素的属性,虽然Attr继承自Node接口,但因为Attr是包含在Element中的,但并不能将其看做是Element的子对象,因为Attr并不是DOM树的一部分
由于解析最常用,先写个解析的实例:
解析实例:
package com.zc.test;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class XmlTest {
@Test
public void resolveStringXml() throws ParserConfigurationException, SAXException, IOException {
String soap = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
+ "<persons>"
+ "<person id=\"001\">"
+ "<name>张三</name>"
+ "<age>20</age>"
+ "</person>"
+ "<person id=\"002\">"
+ "<name>李四</name>"
+ "<age>30</age>"
+ "</person>"
+ "</persons>";
//读取并转换String
Reader rr=new StringReader(soap);
//创建解析工厂DocumentBuilderFactory
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//指定DocumentBuilder实例
DocumentBuilder domBuilder=builderFactory.newDocumentBuilder();
//创建Document对象
Document document=domBuilder.parse(new InputSource(rr));
//获取文档的根节点
NodeList roots = document.getChildNodes();
Node root = roots.item(0);
//获取文档根节点的第二种方式
//Element documentElement = document.getDocumentElement();
//根节点的标签名为persons
if (root != null && root.getNodeName().equals("persons")){
//获取persons下所有节点,返回结果为数组
NodeList persons = root.getChildNodes();
//遍历数组
for (int i = 0; i < persons.getLength(); i++) {
//获取person节点
Node person = persons.item(i);
if (person.getNodeName().equals("person")){
//获取属性id的值
String id = person.getAttributes().getNamedItem("id").getNodeValue();
//获取person节点下的所有节点
NodeList nodes = person.getChildNodes();
for (int j = 0; j < nodes.getLength(); j++) {
//获取第一个标签
Element node = (Element)nodes.item(j);
//判断是不是name标签
if (node.getNodeName().equals("name")){
String name = node.getFirstChild().getNodeValue();
};
if (node.getNodeName().equals("age")){
String age = node.getFirstChild().getNodeValue();
}
}
}
}
}
}
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
XmlTest xmlTest = new XmlTest();
xmlTest.resolveStringXml();
}
}
创建xml文档并保存:
创建xml文档的方法如下:
//创建一个Document,用于存储成xml
public static Document creat_xml()
{
//为解析XML作准备,创建DocumentBuilderFactory实例,指定DocumentBuilder
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
try {
db = dbf.newDocumentBuilder();
Document doc = db.newDocument();
//下面是建立XML文档内容的过程,先建立根元素
Element root = doc.createElement("花名册");
//根元素添加到文档
doc.appendChild(root);
//建立子元素
for (int i = 0; i < 10; i++) {
//建立一级子元素,添加到根元素
Element student = doc.createElement("学生");
//为一级子元素设置属性
student.setAttribute("性别", "男");
root.appendChild(student);
//为一级子元素添加文本
Text tName = doc.createTextNode("学生"+i);
student.appendChild(tName);
}
return doc;
} catch (Exception err) {
err.printStackTrace();
System.exit(1);
}
return null;
}
保存需要一个额外的jar包,可在这里下载:https://blog.youkuaiyun.com/luanpeng825485697/article/details/78164344
//将Document保存成xml文件
public static void save_xml(Document doc,String filepath) {
FileOutputStream outStream = null;
OutputStreamWriter outWriter = null;
try {
//把XML文档输出到指定的文件
//先将Document强转成XmlDocument
org.apache.crimson.tree.XmlDocument xmlDoc = (org.apache.crimson.tree.XmlDocument)doc;
//输出到指定路径下
outStream = new FileOutputStream(filepath);
outWriter = new OutputStreamWriter(outStream);
xmlDoc.write(outWriter, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
outWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
本文参考了以下几篇博客,复制了很多原博客内容。只为学习,侵删。
https://blog.youkuaiyun.com/liweigov/article/details/6628071#commentsedit
http://www.cnblogs.com/shenliang123/archive/2012/05/11/2495252.html
https://blog.youkuaiyun.com/luanpeng825485697/article/details/78164344
https://blog.youkuaiyun.com/RickyIT/article/details/53813246