9.XML文件解析

一.XML简介

XML(EXtensible Markup Language),可扩展标记语言

特点:XML与操作系统、编程语言的开发平台无关 实现不同系统之间的数据交换

作用:数据交互 配置应用程序和网站 Ajax基石

二.XML标签

XML文档内容由一系列标签元素组成

语法:

(1)属性值用双引号包裹

(2)一个元素可以有多个属性

(3)属性值中不能直接包含<、“、&(不建议:‘、>)

三.XML编写注意事项

标签编写注意事项

(1)所有XML元素都必须有结束标签

(2)XML标签对大小写敏感

(3)XML必须正确的嵌套

(4)同级标签以缩进对齐

(5)元素名称可以包含字母、数字或其他的字符

(6)元素名称不能以数字或者标点符号开始

(7)元素名称中不能含空格

四.转义符

XML中的转义符列表

当元素中出现很多特殊字符时,可以使用CDATA节,如: <description> <![CDATA[讲解了元素<title>以及</title>的使用]]> </description>

 五.XML解析器

解析器类型

(1)非验证解析器:检查文档格式是否良好

(2)验证解析器:使用DTD检查文档的有效性

六.解析XML技术

七.xml文件的引入

7.1 创建Student.java类

 1 package com.entity;
 2 /**
 3  * 1.创建学生类
 4  * @author pc
 5  *
 6  */
 7 public class Student {
 8     private int id;
 9     private String name;
10     private String course;
11     private int score;
12     
13     public Student() {
14     }
15     public Student(int id, String name, String course, int score) {
16         this.id = id;
17         this.name = name;
18         this.course = course;
19         this.score = score;
20     }
21     public int getId() {
22         return id;
23     }
24     public void setId(int id) {
25         this.id = id;
26     }
27     public String getName() {
28         return name;
29     }
30     public void setName(String name) {
31         this.name = name;
32     }
33     public String getCourse() {
34         return course;
35     }
36     public void setCourse(String course) {
37         this.course = course;
38     }
39     public int getScore() {
40         return score;
41     }
42     public void setScore(int score) {
43         this.score = score;
44     }
45     @Override
46     public String toString() {
47         return "Student [course=" + course + ", id=" + id + ", name=" + name
48                 + ", score=" + score + "]";
49     }
50     
51     
52 
53 }
Student.java

7.2 创建测试类Test.java

 1 package com.entity;
 2 
 3 public class Test {
 4 
 5     /**
 6      * @param args
 7      */
 8     public static void main(String[] args) {
 9       Student mengmeng=new Student(1, "许萌", "java", 98);
10       Student zhangfujun=new Student(2, "张福军", "java", 98);
11      System.out.println(mengmeng);
12      System.out.println(zhangfujun);
13     }
14 
15 }
Test.java

7.3 对象映射到xml文件Student.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <students>
 3   <student id="1">
 4     <name>许萌</name>
 5     <course>java</course>
 6     <score>98</score>
 7   </student>
 8   <student id="2">
 9     <name>张福军</name>
10     <course>mysql</course>
11     <score>98</score>
12   </student>
13 </students>
Student.xml

八.DtD的创建

(1)声明DTD:<!DOCTYPE 根元素 [定义内容]>
(2)定义dtd元素标签节点:<!ELEMENT 标签名 元素类型> 
(3)定义dtd元素标签属性:<!ATTLIST 元素名称 属性名称 属性类型 属性默认值>
(4)ELEMENT 定义标签节点
(5)ATTLIST 定义标签属性
(6)PCDATA 表示属性类型是字符数据
(7)#REQUIRED 属性值是必须的
(8)#IMPLIED 属性值不是必须的
(9)#FIXED 属性值是固定的
(10)(|)给元素分组
(11)A|B 必须选择A或B
(12)A,B 表示A和B按照顺序出现
(13)A* 表示A出现0到n次
(14)A? 表示A出现0到1次
(15)A+ 表示A出现一次或n次

8.1 案例:创建school.xml文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE 学校[
 3 <!ELEMENT 学校 (班级+)>
 4 <!ELEMENT 班级 (名称?,教师+)>
 5 <!ELEMENT 名称 (#PCDATA)> 
 6 <!ELEMENT 教师 (#PCDATA)> 
 7 ]>
 8 <学校>
 9   <班级>
10      <名称>淘宝31</名称>
11      <教师>徐娟</教师>
12      <教师>Holly</教师>
13   </班级>
14 </学校>
school.xml

九.DOM解析xml文件

9.1 案例使用DOM读取xml文件

9.1.1 在项目根目录下创建book.xml

1 <?xml version="1.0" encoding="UTF-8"?>
2 <books>
3     <book id="bk1001">
4         <title>三国演义</title>
5         <author>罗贯中</author>
6         <price>30元</price>
7     </book>
8 </books>
book.xml

9.1.2 在com.dom包下下创建DomTest.java

 1 package com.dom;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.xml.parsers.DocumentBuilder;
 6 import javax.xml.parsers.DocumentBuilderFactory;
 7 import javax.xml.parsers.ParserConfigurationException;
 8 
 9 import org.w3c.dom.Document;
10 import org.w3c.dom.Node;
11 import org.w3c.dom.NodeList;
12 import org.xml.sax.SAXException;
13 
14 /**
15  * 1.使用dom读取xml文件=解析xml文件
16  * @author pc
17  *
18  */
19 public class DomTest {
20     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
21         //1.得到DOM解析器工厂实例
22         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
23         //2.从DOM解析器工厂获取DOM解析器
24         DocumentBuilder db=dbf.newDocumentBuilder();
25         //3.读取book.xml文件,转换DOM树(book.xml文件必须放在项目根目录下)
26         Document doc=db.parse("book.xml");
27         //4.从DOM树中获取所有根节点列表
28         NodeList allbooks=doc.getChildNodes();
29         //5.获取图书节点books
30         Node booksNode=allbooks.item(0);
31         //6.获取的books图书节点下的所有子节点列表book
32         NodeList books=booksNode.getChildNodes();
33         //7.循环遍历子节点列表信息
34         for (int i = 0; i < books.getLength(); i++) {
35             //7.1获取第i个book节点元素
36             Node book =books.item(i);
37             //7.2获取book节点下的所有元素节点
38             NodeList items=book.getChildNodes();
39             //7.3循环遍历book节点下的所有元素节点
40             for (int j = 0; j < items.getLength(); j++) {
41                 //7.3.1 获取book节点下的某个元素节点
42                 Node node=items.item(j);
43                 //7.3.2 获取元素节点的名称
44                 String nodeName=node.getNodeName();
45                 //7.3.3 获取元素节点的内容
46                 String nodeConent=node.getTextContent();
47                 //7.3.4判断节点名称获取对应的节点内容
48                 if(nodeName.equals("title")){
49                     System.out.println("书名:"+nodeConent);
50                 }else if(nodeName.equals("author")){
51                     System.out.println("作者:"+nodeConent);
52                 }else if(nodeName.equals("price")){
53                     System.out.println("价格:"+nodeConent);
54                 }
55                 
56             }
57             
58         }
59         
60         
61     }
62 
63 }
DomTest.java

9.2 案例使用DOM对xml文件增删改查

9.2.1 在项目根目录下创建student.xml

 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 2 <students>
 3     <student id="1">
 4         <name>许萌</name>
 5         <course>java</course>
 6         <score>98</score>
 7     </student>
 8     <student id="2">
 9         <name>张福军</name>
10         <course>mysql</course>
11         <score>98</score>
12     </student>
13 </students>
Student.xml

9.2.2 在com.dom包下下创建DomTest2.java

  1 package com.dom;
  2 
  3 import java.io.FileOutputStream;
  4 import java.io.IOException;
  5 
  6 import javax.print.Doc;
  7 import javax.xml.parsers.DocumentBuilder;
  8 import javax.xml.parsers.DocumentBuilderFactory;
  9 import javax.xml.parsers.ParserConfigurationException;
 10 import javax.xml.transform.OutputKeys;
 11 import javax.xml.transform.Transformer;
 12 import javax.xml.transform.TransformerConfigurationException;
 13 import javax.xml.transform.TransformerException;
 14 import javax.xml.transform.TransformerFactory;
 15 import javax.xml.transform.dom.DOMSource;
 16 import javax.xml.transform.stream.StreamResult;
 17 
 18 import org.w3c.dom.Document;
 19 import org.w3c.dom.Element;
 20 import org.w3c.dom.Node;
 21 import org.w3c.dom.NodeList;
 22 import org.xml.sax.SAXException;
 23 
 24 /**
 25  * dom4j对xml文件全套增删改查
 26  * 
 27  * @author pc
 28  * 
 29  */
 30 public class DomTest2 {
 31     public static void main(String[] args) throws ParserConfigurationException,
 32             SAXException, IOException, TransformerException {
 33         //add();
 34         update();
 35         delete();
 36         select();
 37 
 38     }
 39 
 40     private static void select() throws ParserConfigurationException,
 41             SAXException, IOException {
 42         // 1.创建dom解析器工厂
 43         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 44         // 2.从dom工厂获取DOM解析器
 45         DocumentBuilder db = dbf.newDocumentBuilder();
 46         // 3.读取student.xml文件,转换为DOM数,该文在必须在项目根目录
 47         Document doc = db.parse("Student.xml");
 48         // 4.从DOM中获取所有根节点列表students
 49         NodeList studentsList = doc.getChildNodes();
 50         // 5.获取第一个根节点studens
 51         Node studentsNode = studentsList.item(0);
 52         // 6.从第一个根节点下获取所有的student子节点列表
 53         NodeList studentList = studentsNode.getChildNodes();
 54         // 7.循环遍历student子节点
 55         for (int i = 0; i < studentList.getLength(); i++) {
 56             // 7.1 获取某个student节点
 57             Node student = studentList.item(i);
 58             // 7.2 获取student节点下所有元素节点列表(name,course,score)
 59             NodeList items = student.getChildNodes();
 60             // 7.3 循环student节点下的所有元素节点
 61             for (int j = 0; j < items.getLength(); j++) {
 62                 // 7.3.1 获取某个元素节点(name,course,score)
 63                 Node node = items.item(j);
 64                 // 7.3.2 获取某个元素节点名称
 65                 String nodeName = node.getNodeName();
 66                 // 7.3.3 获取某个元素节点的内容
 67                 String nodeContent = node.getTextContent();
 68                 // 7.3.4 判断根据元素节点名称获取对应元素节点内容
 69                 if (nodeName.equals("name")) {
 70                     System.out.println("姓名:" + nodeContent);
 71                 } else if (nodeName.equals("course")) {
 72                     System.out.println("课程:" + nodeContent);
 73                 } else if (nodeName.equals("score")) {
 74                     System.out.println("成绩:" + nodeContent);
 75                 }
 76             }
 77 
 78         }
 79 
 80     }
 81 
 82     private static void add() throws ParserConfigurationException,
 83             SAXException, IOException, TransformerException {
 84         // 1.创建dom解析器工厂
 85         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 86         // 2.从dom工厂获取DOM解析器
 87         DocumentBuilder db = dbf.newDocumentBuilder();
 88         // 3.读取student.xml文件,转换为DOM数,该文在必须在项目根目录
 89         Document doc = db.parse("Student.xml");
 90         // 4.创建Student节点
 91         Element studentElement = doc.createElement("student");
 92         // 5.为Student节点设置属性
 93         studentElement.setAttribute("id", "3");
 94         // 6.创建name元素节点
 95         Element nameElement = doc.createElement("name");
 96         // 7.为name元素节点添加内容
 97         nameElement.setTextContent("陈金锋");
 98         // 8.将name元素节点放入Student节点
 99         studentElement.appendChild(nameElement);
100         // 9.创建course元素节点
101         Element courseElement=doc.createElement("course");
102         // 10.为course元素节点添加内容
103         courseElement.setTextContent("JSP");
104         // 11.将course元素节点添加到Student节点内
105         studentElement.appendChild(courseElement);
106         // 12.创建score元素节点
107         Element scoreElement=doc.createElement("score");
108         // 13.为score元素节点添加内容
109         scoreElement.setTextContent("90");
110         // 14.将score元素节点添加到Student节点内
111         studentElement.appendChild(scoreElement);
112         // 15.获取Students根节点(根据节点名获取整个节点)
113         Element studentsElement=(Element) doc.getElementsByTagName("students").item(0);
114         // 16.将student节点放入Students根节点中
115         studentsElement.appendChild(studentElement);
116         // 17.创建添加节点工厂对象
117         TransformerFactory transformerFactory=TransformerFactory.newInstance();
118         // 18.根据添加节点工厂对象创建添加节点对象
119         Transformer transformer=transformerFactory.newTransformer();
120         // 19.将整个节点放入内存
121         DOMSource domSource=new DOMSource(doc);
122         // 20.设置编码类型
123         transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
124         // 21.创建输出流对象,并执行写入路径
125         StreamResult result=new StreamResult(new FileOutputStream("Student.xml"));
126         // 22.添加节点对象将内存中dom写入文件
127         transformer.transform(domSource, result);
128         System.out.println("添加成功!!");
129     }
130 
131     private static void update() throws ParserConfigurationException, SAXException, IOException, TransformerException {
132         //1.获取dom解析器工厂对象
133         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
134         //2.从DOM解析器工厂获取dom解析器
135         DocumentBuilder db=dbf.newDocumentBuilder();
136         //3.读取Student.xml,生成DOM树
137         Document doc=db.parse("Student.xml");
138         //4.找到修改的节点所在集合
139         NodeList studentList=doc.getElementsByTagName("student");
140         //5.循环遍历修改节点所在集合
141         for (int i = 0; i < studentList.getLength(); i++) {
142             //5.1.获取某个student节点
143             Element studentElement=(Element) studentList.item(i);
144             //5.2 获取Student节点的id属性值
145             String studentId=studentElement.getAttribute("id");
146             //5.3判断Student节点的id值是否是要修改的id为3的节点
147             if(studentId.equals("3")){
148                 //5.3.1 获取修改的Student节点下的Score元素节点
149                Element scoreElement=(Element) studentElement
150                .getElementsByTagName("score").item(0);
151                 //5.3.2  修改score节点文本内容
152                scoreElement.setTextContent("60");
153                System.out.println("update is success!");
154             }
155         }
156         //6.创建添加节点工厂对象
157         TransformerFactory transformerFactory=TransformerFactory.newInstance();
158         //7.根据添加节点工厂对象创建添加节点对象
159         Transformer transformer=transformerFactory.newTransformer();
160         //8.将dom放入内存中
161         DOMSource domSource=new DOMSource(doc);
162         //9.设置编码类型
163         transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
164         //10.创建输出流并指定写入路径
165         StreamResult result=new StreamResult(new FileOutputStream("Student.xml"));
166         //11.根据添加节点对象将内存中dom树,写入xml文件
167         transformer.transform(domSource, result);
168     }
169 
170     private static void delete() throws ParserConfigurationException, SAXException, IOException, TransformerException {
171         //1.创建dom解析器工厂
172         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
173         //2.根据dom解析器工厂创建dom解析器
174         DocumentBuilder db=dbf.newDocumentBuilder();
175         //3.读取xml文件,并生成dom树
176         Document doc=db.parse("Student.xml");
177         //4.找到所有的student节点集合
178         NodeList studentList=doc.getElementsByTagName("student");
179         //5.循环找出要删除的student节点
180         for (int i = 0; i < studentList.getLength(); i++) {
181             //5.1 获取某个student节点
182             Element studentElement=(Element) studentList.item(i);
183             //5.2 获取某个student节点的id属性
184             String studentid=studentElement.getAttribute("id");
185             //5.3 判断id属性值是否是我们要找的id值
186             if(studentid.equals("3")){
187                 //5.3.1 删除student的id为某个值的整个student节点
188                 studentElement.getParentNode()
189                 .removeChild(studentElement);
190                 System.out.println("delete is success!!");
191             }
192             
193         }
194         //6.创建添加节点工厂对象
195         TransformerFactory transformerFactory=TransformerFactory.newInstance();
196         //7.根据添加节点工厂对象创建添加节点对象
197         Transformer transformer=transformerFactory.newTransformer();
198         //8.将dom放入内存中
199         DOMSource domSource=new DOMSource(doc);
200         //9.设置编码类型
201         transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
202         //10.创建输出流并指定写入路径
203         StreamResult result=new StreamResult(new FileOutputStream("Student.xml"));
204         //11.根据添加节点对象将内存中dom树,写入xml文件
205         transformer.transform(domSource, result);
206 
207     }
208 
209 }
DomTest2.java

十.使用DOM4j操作xml文件

10.1.2 在com.dom4j包下下创建DOM4jParse.java

 1 package com.dom4j;
 2 
 3 import java.io.File;
 4 import java.util.HashMap;
 5 import java.util.Iterator;
 6 
 7 import org.dom4j.Document;
 8 import org.dom4j.DocumentException;
 9 import org.dom4j.Element;
10 import org.dom4j.io.SAXReader;
11 
12 /**
13  * 使用DOM4j解析xml文件
14  * @author Holly老师
15  *
16  */
17 public class DOM4jParse {
18     public static void main(String[] args) throws DocumentException {
19         //1.创建HashMap集合,存放解析后的内容
20         HashMap<String, String> hashMap=new HashMap<String, String>(); 
21         //2.获取xml文件所在的路径(System.getProperty("user.dir")=项目真实路径)
22         String xmlPath=System.getProperty("user.dir")+"\Student.xml";
23         /*3.解析xml文件内容到map集合
24         *(参数分为输入参数和输出参数,)
25         *输入参数可以是任意类型,
26         *输出参数只能是引用类型
27         */
28         dom4jParseXml(xmlPath,hashMap);
29         //4.循环遍历map集合打印内容
30         for (int i = 0; i < hashMap.size(); i+=3) {
31             int j=i/3; //第一个student节点
32             System.out.print(hashMap.get("name"+j)+"	");
33             System.out.print(hashMap.get("course"+j)+"	");
34             System.out.println(hashMap.get("score"+j)+"	");
35         }
36         
37     }
38    /**
39     * 
40     * @param xmlPath xml文件路径
41     * @param hashMap
42  * @throws DocumentException 
43     */
44     private static void dom4jParseXml(String xmlPath,
45             HashMap<String, String> hashMap) throws DocumentException {
46         //1.创建读取xml文件的对象(xml输入流对象)
47         SAXReader saxReader=new SAXReader();
48         //2.创建文件流指定读取路径
49         File file=new File(xmlPath);
50         //3.在指定路径中读取xml文件并转换为dom树
51         Document document =saxReader.read(file);
52         //4.获取xml文档的根节点
53         Element root=document.getRootElement();
54         //5.定义用于记录学生编号的变量
55         int num=-1;
56         //6.获取根元素students下的所有的student放入迭代器集合
57         Iterator studentList=root.elementIterator();
58         //7.循环student标签集合
59         while(studentList.hasNext()){
60             //获取某个student节点标签
61             Element studentElement=(Element) studentList.next();
62             num++;
63             //获取student标签下的所有元素节点的集合
64             Iterator studentContentList=studentElement.elementIterator();
65             //循环获取student标签下元素节点内容
66             while(studentContentList.hasNext()){
67                 //获取student标签下的某个元素节点
68                 Element studentContent=(Element) studentContentList.next();
69                 //循环将读取到的元素节点内容放入hashmap中(getName()获取标签名,getText()标签文本内容)
70                 hashMap.put(studentContent.getName()+num, studentContent.getText());
71             }
72         }
73         
74     }
75 
76 }
DOM4jParse.java
原文地址:https://www.cnblogs.com/holly8/p/6149199.html