9.XML文件解析

一.xml文件的引入

1.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

1.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

1.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的创建

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

案例:创建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文件

3.1 案例使用DOM读取xml文件

3.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

3.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

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

3.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

3.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文件

4.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)+"\t");
33             System.out.print(hashMap.get("course"+j)+"\t");
34             System.out.println(hashMap.get("score"+j)+"\t");
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

时间: 2024-10-12 17:06:38

9.XML文件解析的相关文章

android基础知识13:AndroidManifest.xml文件解析

1.重要性 AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息. 因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所

XML文件解析之JDOM解析

1.JDOM介绍 JDOM的官方网站是http://www.jdom.org/,JDOM解析用到的jar包可以在http://www.jdom.org/dist/binary/中下载,最新的JDOM2的版本是2.0.5,JDOM1的版本是1.1.3,根据官网中的介绍可以知道.JDOM是一个在基于内存的XML模型,它用于读写创建修改XML文档.JDOM和DOM相似因为他们都提供了内存XML文档模型,但是DOM被设计用于很多种语言(C,C++,ECMSctipr,Java,JScript,Lingo

java基础之概谈xml文件解析

XML已经成为一种很通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.诸多web应用框架,其可配置的编程方式,给我们的开发带来了很大程度的便捷,但细细想来,它们的应用无一不是java bean与xml之间的转换解析.本文将对xml的两种操作标准DOM和SAX,从它们各自的特点.适用范围等方面进行简单介绍. DOM (Document Object Model) :DOM标准中,采用W3C标准表示XML,有多重语言支持,因此其跨平台性很好.采用DOM规范

XML文件解析【安卓7】——SAX解析

XML文件解析 XML解析:XML技术是Android平台的应用基础,  Android提供了多种解析XML的方式:SAX解析.DOM解析.PULL解析 SAX解析 SAX --Simple  API  forXML  (XML简单的API) --解析速度快.占用内存少 --提供一组简单的API用于解析XML文件 --SAX在解析XML文件前,先指定一个解析事件处理器(Handler),SAX会对XML文档进行简单的顺序扫描,当扫描到[文档(Document)的开始和结束.元素(Element)

XML文件解析器TXml

前几天看了开源的XML文件解析器TinyXml,它是怎么实现解析的没怎么看懂,于是决定自己实现一个,反正最近不忙.先命名为TXml.现在完成了解析和查询功能,全部代码加起来不到1000行,将会继续完善它.源码必共享 先简单说一下我的思路: 1:读取XML文件信息,并存入一个字符数组中: 2:遍历数组,将数组解析成一棵树: 3:以路径的方式查询和按属性查询: 这个解析器最麻烦的地方就在怎么将字符数组解析成一颗树.我们先看一下一个简单XML文件,他包括文件头.节点.节点名称及节点值.属性名称及属性值

八、Android学习第七天——XML文件解析方法(转)

(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:extensible markup language 定义:用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 解析XML的方式: SAX——Simple API for XML,既是一种接口,也是一个软件包采用的是事件驱动,也就是它解析

Win10系列:VC++ XML文件解析

XML文件按照元素标记来存储数据,通过遍历这些元素标记可以得到XML文件中所保存的数据.在C++/CX的类库中并未定义用于解析XML文件的类,但C++提供了能解析XML文件的框架和类库,如msxml4.libxml.IXMLDOM和TinyXML等,在使用C++/CX编写应用程序时可以通过C++提供的框架和类库来解析XML文件.TinyXML是一个轻量级解析XML的框架,本节将介绍如何使用此框架来解析一个XML文件. TinyXML框架包含了以下的类和函数,通过使用这些类和函数可以方便地读取一个

通过正则表达式实现简单xml文件解析

这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node对象.xml文档树上的每一个节点都是一个Node对象,对象拥有title.attribute和text三个自身变量以及一个childrenNode集合. 一.编写Node类 import java.io.Serializable; import java.util.HashMap; import j

JAVA之XML文件解析

在Java.Android开发中,xml文件的解析很重要.本人使用过的xml文件解析的方式有两种,一种是DOM文档解析.还有一种是SAX. DOM是基于文档树结构的.SAX是基于事件驱动的.SAX则是遇到标签则触发工作的.当解析器发现元素开始.元素结束.文本.文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据.优缺点很明显:DOM对于大型文件的操作不好(因为它要先读入整个文档到内存中),SAX为了解决这样问题.不用事先调入整个文档,占用资源少:SAX解析器代码比DOM解析器代

dtd与schema的区别&amp;XML文件解析常用方式

Schema和DTD 都是用来定义各种文件中XML标记的使用规范.Schema是标准的XML文件,而DTD则使用自己的特殊语法,因此,只需要知道XML的语法规则就可以编写Schema了,不需要再学习其它语法规则.可以使用相同的处理器来解读,Schema利用命名空间将文件中特殊的节点与Schema说明相联系,一个XML文件可以有多个对应的Schema,若是DTD的话,一个XML文件只能有一个相对应的DTD文件.Schema的内容模型是开放的,可以随意扩充,而DTD则无法解读扩充的内容.DTD只能把