XML解析--DOM解析

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>
View Code

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 }
View Code

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     }
View Code

修改标签内容

 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     }
View Code

删除标签

 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     }
View Code
原文地址:https://www.cnblogs.com/nicker/p/6432902.html