XML的解析
对XML文件进行操作,包括创建xml,对xml文件进行增删改查操作。
3.1 常见的xml解析技术
3.1.1 DOM解析
是官方提供的解析方式,基于xml树解析的
比较耗资源,适用于多次访问xml
3.1.2 SAX解析
是民间的解析方式,基于事件的解析
消耗资源小,使用于数据量较大的xml
3.1.3 JDOM解析
第三方提供,开源免费的解析方式,比DOM解析快
仅使用具体类而不使用接口
3.1.4 DOM4J解析
第三方提供,开源免费的解析方式,是JDOM的升级版
使用接口而不是实现类
dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。
3.2 DOM4J解析XML
解析xml的入口,是需要先拿到一个Document对象
3.2.1 读取xml文件中的信息
导入jar包:
下载地址:https://dom4j.github.io/
新建一个class文件:
package wangke_xml;
import java.io.File;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class TestXml {
public static void main(String[] args) throws Exception {
//[1] 创建SAXReader对象,用于读取xml文件
SAXReader reader = new SAXReader();
//[2] 读取xml文件,得到Document对象
Document doc = reader.read(new File("src/scores2.xml"));
System.out.println(doc); //此时就生成了一个Document对象,里面包含了整个xml的所有信息
}
}
此时就找到了入口
下面开始解析
思路:以根元素为出发点,一层一层往下往下取子元素
完整代码:
package wangke_xml;
import java.io.File;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class TestXml {
public static void main(String[] args) throws Exception {
// [1] 创建SAXReader对象,用于读取xml文件
SAXReader reader = new SAXReader();
// [2] 读取xml文件,得到Document对象
Document doc = reader.read(new File("src/scores2.xml"));
//System.out.println(doc); //此时就生成了一个Document对象,里面包含了整个xml的所有信息
// [3] 获取根元素
Element root = doc.getRootElement();
//System.out.println(root.getName()); //获取到根元素的名字
// [4] 获取根元素下所有子元素
Iterator<Element> it = root.elementIterator(); //用迭代器
while(it.hasNext()) { //迭代器是配合while使用的
//取出元素
Element e = (Element) it.next();
System.out.println(e.getName()); //输出两个student
//获取id属性
Attribute id = e.attribute("id");
System.out.println(id.getName() + "=" + id.getValue()); //如果有多个属性,就用属性迭代器
//获取student的子元素
Element name = e.element("name");
Element course = e.element("course");
Element score = e.element("score");
System.out.println(name.getName() + "=" + name.getStringValue()); //取文本内容
System.out.println(course.getName() + "=" + course.getText());
System.out.println(score.getName() + "=" + score.getText());
System.out.println("------------------------------");
}
}
}
3.2.2 DOM4J生成xml
解析xml的入口点,需要形成一个Document对象
上一个是读一个已有的xml文件,然后形成一个Document对象
现在是没有xml,把一些信息写成一个xml文件
所以是自己创建一个Document对象
package wangke_xml;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class TestXml2 {
public static void main(String[] args) throws IOException {
// [1] 通过DocumentHelper生成一个Document对象
Document doc = DocumentHelper.createDocument();
//链式编程,下面的[2]~[4]可以用以下这句话表示:
//doc.addElement("books").addElement("book").addAttrubute("id","b01");
// [2] 添加并得到根元素
Element root = doc.addElement("books");
// [3] 为根元素添加子元素
Element book = root.addElement("book");
// [4] 为book元素添加属性
book.addAttribute("id", "b01"); //返回的还是Element类型
// [5] 为book添加子元素
Element name = book.addElement("name");
Element author = book.addElement("author");
Element price = book.addElement("price");
// [6] 为子元素添加文本
name.addText("Thinking in Java");
author.addText("小明");
price.addText("80");
// [7] 将doc输出到xml文件即可
Writer writer = new FileWriter(new File("src/book2.xml"));
doc.write(writer);
// [8] 关闭资源
writer.close();
}
}
运行,刷新一下文件列表,就看到已经创建了一个book2.xml
但输出的格式是这样的:
如果要输出格式良好的,修改一下:
把 [7][8]
改成下面这个:
把之前生成的book2.xml删掉,重新运行,得到的新的book2.xml是这样的: