xml解析:用程序来读取xml的内容。
xml的解析方式有两种:
1、DOM解析
2、SAX解析
xml解析对应的工具大致有以下几种:
DOM解析工具:
1)JAXP(oracle-Sun公司官方)
2)JDOM工具(非官方)
3)Dom4J工具(非官方)三大框架默认读取xml的工具就是Dom4J
SAX解析工具:
1)Sax解析工具(oracle-sun 公司官方)
DOM解析
原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)xml文档的内容。
DOM(Document Object Model)文档对象模型,DOM的三层模型将html和xml定义成树形结构,文档中的标签、属性、文本等都封装成节点对象。
节点对象:
根节点:没有父节点的节点对象,xml中只有一个根节点。
元素节点:根节点和根节点中的所有标签都是元素节点。
属性节点:<student id=“001”></student> id就是属性节点。
文本节点:<name>zhangsan</name> zhangsan就是文本节点
注释节点:<!-- --> xml文档中的注释信息
Dom4j使用
Dom4j工具是非官方的,这里提供一个下载地址:http://pan.baidu.com/s/1c5WL0i
Dom4j中集成的 XPath(路径查询语言)支持、 XML Schema(约束模式文档)支持。
使用步骤:
1)导入dom4j的核心包,dom4j-1.6.1.jar
2)编写Dom4j读取xml文件的代码。
Dom4j的体系结构

常用方法API
1)获取xml文档对象Document:
1 File xmlFile = new File(“test.xml”);//找到文件 2 SAXReader reader = new SAXReader(); //创建reader对象 3 Document xmlDoc = reader.read(xmlFile); //读取xml文件,并生成document对象
2)获取标签元素节点
1 Element root = xmlDoc.getRootElement(); //获取根元素对象
2 String elementName = root.getName(); //获取根元素的标签名
3 lement element = root.element(“元素名称"); //通过元素名称获取第一个元素名称的对象
4 List elementList = root.elements(); //获取所有这季节子元素的集合
5 Iterator<Element> root.elementIterator("标签名");// 指定名称的所有子标签
3)获取属性元素节点
1 Attribute attribute = element.attribute(“属性名称"); //通过属性名获取元素属性对象 2 Attribute attribute = element.attribute(0); //通过索引获取属性对象 3 List attributeList = root.attributes(); //获取所有属性对象集合 4 Iterator<Attribute> root.attibuteIterator(); //获取所有属性对象 5 String value = attribute.getValue(); //通过属性值 6 String name = attribute.getName(); //通过属性名 7 String value = element.attributeValue(“属性名称”); //通过属性名来获取元素的属性值
4)获取属性文本节点
1 String text = element.getText(); //获取element元素的内部文本 2 String text = element.elementText(“子元素名称”); //获取element子元素内部文本
5)创建增加操作(文档对象、标签、属性、文本)
1 Document document = DocumentHelper. createDocument(); //创建文档Document 2 Element element = document.addElement(“元素名称"); //创建元素 3 element. addAttribute(“属性名”,“属性值"); //创建属性--添加属性方法返回的是原元素对象。如同StringBuffer。 4 element.addText(“文本"); //创建文本
6)修改操作(属性、文本)
1 //=====修改属性
2 Element contactElem = doc.getRootElement().element("contact");
3 Attribute idAttr = contactElem.attribute("id");
4 idAttr.setValue("003"); //通过属性对象来修改属性值
5
6 Element contactElem = doc.getRootElement().element("contact");
7 contactElem.addAttribute("id", "004"); //通过添加的方式来进行覆盖修改
8
9 //=====修改文本
10 Element rootElem = doc.getRootElement().
11 rootElem.setText("李四"); //修改文本
7)删除操作(标签、属性、文本)
1 remove(Element element) //删除标签 2 remove(Attribute attribute) //删除属性 3 remove(Text text) //删除文本
8)写出xml文档
1 FileOutputStream out = new FileOutputStream("e:/contact.xml"); //指定文件输出的位置
2 //指定写出格式
3 OutputFormat format = OutputFormat.createCompactFormat(); //紧凑的格式.去除空格换行.项目上线的时候
4 //OutputFormat format = OutputFormat.createPrettyPrint(); //漂亮的格式.有空格和换行.开发调试的时候
5 format.setEncoding("utf-8"); //指定生成的xml文档的编码,同时影响了xml文档保存时的编码 和 xml文档声明的encoding的编码(xml解析时的编码)
6 XMLWriter writer = new XMLWriter(out,format); 1.创建写出对象
7 writer.write(doc); //写出对象
8 writer.close(); //关闭流
代码示例:
1、把xml文档信息封装到对象中
contact.xml文件

1 <?xml version="1.0" encoding="utf-8"?> 2 <contactList> 3 <contact id="001"> 4 <name>张三</name> 5 <age>20</age> 6 <phone>134222223333</phone> 7 <email>zhangsan@qq.com</email> 8 <qq>432221111</qq> 9 </contact> 10 <contact id="002"> 11 <name>李四</name> 12 <age>20</age> 13 <phone>134222225555</phone> 14 <email>lisi@qq.com</email> 15 <qq>432222222</qq> 16 </contact> 17 </contactList>
java文件

1 import java.util.List;
2
3 import org.dom4j.Document;
4 import org.dom4j.Element;
5 import org.dom4j.io.SAXReader;
6
7 /**
8 * 把xml文档信息封装到对象中
9 * @author APPle
10 *
11 */
12 public class Demo4 {
13
14 public static void main(String[] args) throws Exception{
15 List<Contact> list = new ArrayList<Contact>();
16
17 //读取xml,封装对象
18 SAXReader reader = new SAXReader();
19 Document doc = reader.read(new File("./src/contact.xml"));
20 //读取contact标签
21 Iterator<Element> it = doc.getRootElement().elementIterator("contact");
22 while(it.hasNext()){
23 Element elem = it.next();
24 //创建Contact
25 Contact contact = new Contact();
26 contact.setId(elem.attributeValue("id"));
27 contact.setName(elem.elementText("name"));
28 contact.setAge(elem.elementText("age"));
29 contact.setPhone(elem.elementText("phone"));
30 contact.setEmail(elem.elementText("email"));
31 contact.setQq(elem.elementText("qq"));
32 list.add(contact);
33 }
34
35 for (Contact contact : list) {
36 System.out.println(contact);
37 }
38 }
39 }
2、新建xml文档,并修改和删除里面的内容
创建xml文档的java代码:

1 public void createXMLDocument() throws Exception{
2 //1.内存创建xml文档
3 Document doc = DocumentHelper.createDocument();
4
5 //2.写入内容
6 Element rootElem = doc.addElement("Students");
7
8 //2.1 增加标签
9 Element studentElem1 = rootElem.addElement("Student");
10 //2.2 增加属性
11 studentElem1.addAttribute("id", "1");
12 //2.3 增加标签,同时设置文本
13 studentElem1.addElement("name").setText("张三");
14 studentElem1.addElement("gender").setText("男");
15 studentElem1.addElement("grade").setText("计算机1班");
16 studentElem1.addElement("address").setText("广州");
17
18 //2.1 增加标签
19 Element studentElem2 = rootElem.addElement("Student");
20 //2.2 增加属性
21 studentElem2.addAttribute("id", "2");
22 //2.3 增加标签,同时设置文本
23 studentElem2.addElement("name").setText("李四");
24 studentElem2.addElement("gender").setText("女");
25 studentElem2.addElement("grade").setText("计算机2班");
26 studentElem2.addElement("address").setText("北京");
27
28
29 //3.内容写出到xml文件
30 //3.1 输出位置
31 FileOutputStream out = new FileOutputStream("e:/student.xml");
32 //3.2 指定格式
33 OutputFormat format = OutputFormat.createPrettyPrint();
34 // 设置编码
35 format.setEncoding("utf-8");
36 XMLWriter writer = new XMLWriter(out,format);
37 //3.3 写出内容
38 writer.write(doc);
39 //3.4关闭资源
40 writer.close();
41
42 }
修改标签内容

1 public void changeContent() throws Exception{
2 //1.查询到id为2的学生
3 Document doc = new SAXReader().read(new File("e:/student.xml"));
4 //1.1 找到所有的Student标签
5 Iterator<Element> it = doc.getRootElement().elementIterator("Student");
6 while(it.hasNext()){
7 Element stuElem = it.next();
8 //1.2 查询id为id的学生标签
9 if(stuElem.attributeValue("id").equals("2")){
10 stuElem.element("name").setText("王丽");
11 break;
12 }
13 }
14
15
16 //3.1 输出位置
17 FileOutputStream out = new FileOutputStream("e:/student.xml");
18 //3.2 指定格式
19 OutputFormat format = OutputFormat.createPrettyPrint();
20 // 设置编码
21 format.setEncoding("utf-8");
22 XMLWriter writer = new XMLWriter(out,format);
23 //3.3 写出内容
24 writer.write(doc);
25 //3.4关闭资源
26 writer.close();
27 }
删除标签

1 public void deleteContent() throws Exception{
2 //1.查询到id为2的学生
3 Document doc = new SAXReader().read(new File("e:/student.xml"));
4 //1.1 找到所有的Student标签
5 Iterator<Element> it = doc.getRootElement().elementIterator("Student");
6 while(it.hasNext()){
7 Element stuElem = it.next();
8 //1.2 查询id为id的学生标签
9 if(stuElem.attributeValue("id").equals("2")){
10 //1.3 删除该学生标签
11 stuElem.detach();
12 break;
13 }
14 }
15
16
17 //3.1 输出位置
18 FileOutputStream out = new FileOutputStream("e:/student.xml");
19 //3.2 指定格式
20 OutputFormat format = OutputFormat.createPrettyPrint();
21 // 设置编码
22 format.setEncoding("utf-8");
23 XMLWriter writer = new XMLWriter(out,format);
24 //3.3 写出内容
25 writer.write(doc);
26 //3.4关闭资源
27 writer.close();
28 }
来源:https://www.cnblogs.com/nicker/p/6432902.html
