1.什么是XML?
- XML 指可扩展标记语言(eXtensible Markup Language),就是开发者可以在符合XML命名规则的基础之上,可以根据自己的需求定义自己的标签;
2.XML是怎么来的?
3.和HTML的对比:
HTML | XML | |
---|---|---|
作用 | 显示数据 | 传输和存储数据 |
语法 | 无特殊要求 | 要求嵌套、配对,并遵循DTD的树形结构 |
空格 | 多个时只显示一个 | 输入几个i显示几个 |
与数据库的关系 | 无直接联系 | 与关系型和层状数据库均可对应与转换 |
大小写敏感性 | 不区分 | 区分 |
4.XML的作用是什么?
- XML主要作用是用来存储数据(可以理解为充当一个小型数据库)
- 传输约定格式的文件
- 做软件的配置文件,【配置文件,保存软件设置的文件】
5.解析XML文件的方法:
- DOM
- DOM4J
- SAX
5.1 DOM4J解析xml文件
DOM4J是对DOM方法进行了封装,dom解析的方式非常繁琐 !所以这里只说DOM4J方式
5.1.1 导入dom4j的jar包
<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
5.1.2 DOM4J常用的对象
- SAXReader(解析器):读取xml文件到Document树结构文件对象
- Document:是一个xml文档对象树,类比 Html文档对象。
- Element:元素节点。通过Document对象可以查找单个元素
5.1.3 DOM4J使用步骤:
- 1.创建解析器
SAXReader saxReader = new SAXReader();
- 2.通过解析器的read()方法将配置文件读取到配置文件中 生成一个document[org.dom4j]对象树
Document document = saxReader.read("F:\\ideaFile\\endfile\\src\\main\\resources\\sutdent.xml");
- 3.获取根节点
Element root = document.getRootElement();
- 4.通过iterator遍历根节点root来获取子节点student
这部分代打看下面实例!
5.1.4 DOM4J使用实例:
前提是你有一个xml文件 !
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<name>张安</name>
<age>18</age>
<sex>男</sex>
</student>
<student>
<name>李四</name>
<age>12</age>
<sex>女</sex>
</student>
<student>
<name>我想回家</name>
<age>12</age>
<sex>女</sex>
</student>
<student>
<name>王五</name>
<age>89</age>
<sex>男</sex>
</student>
</students>
文件位置 :
编写解析xml的class类 :
package com.buba.Dom4J;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.Iterator;
public class dom4j {
public static void main(String[] args) {
try {
//创建解析器
SAXReader saxReader = new SAXReader();
//通过解析器的read()方法将配置文件读取到配置文件中 生成一个document[org.dom4j]对象树
Document document = saxReader.read("F:\\ideaFile\\endfile\\src\\main\\resources\\sutdent.xml");
//获取根节点
Element root = document.getRootElement();
//开始遍历根节点
for (Iterator<Element> iterator = root.elementIterator();iterator.hasNext();) {
Element stuelement = iterator.next();
for (Iterator<Element> innerIter = stuelement.elementIterator();innerIter.hasNext();){
Element next = innerIter.next();
String stringValue = next.getStringValue();
System.out.println(stringValue);
}
System.out.println("==========================================");
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
部分输出结果
5.2 SAX解析xml文件
- SAX(Simple API for XML) 是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。 — 百度百科
5.2.1 SAX解析方式
事件驱动,边读边写
5.2.2 SAX执行过程
5.2.3 SAX优点
无需将整个文档加载到内存中,所以内存消耗少,适合解析特别大的XML文件
5.2.4 SAX解析四部曲
(1) 创建解析工厂,通过newInstance()方法获取
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
(2) 创建解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
(3) 调用解析器parser方法,传入两个参数:xml文件路径,时间处理器
saxParser.parse("F:\\**resources\\person.xml",new MyDeafultHander());
(4) 创建一个类,继承DefaultHander类,重写三个方法:
- A、startElement 获取开始标签,重要的两个参数说明
- a、qName:把标签名称返回
- b、attributes:返回标签中的属性对象
- B、character 获取标签文本内容
- C、endElement 获取结束标签
5.2.5 实例:获取person文件并原样打出
- 准备person,xml文件
- 编写personTest类
package com.buba.xmlTest; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.IOException; public class SAXParserTest { public static void main(String[] args) { try { //创建解析工厂 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); //创建解析器 SAXParser saxParser = saxParserFactory.newSAXParser(); //调用解析器的parser方法 saxParser.parse("F:\\ideaFile\\endfile\\src\\main\\resources\\person.xml",new MyDeafultHander()); } catch (ParserConfigurationException | IOException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } } } class MyDeafultHander extends DefaultHandler{ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.print("<"+qName+">"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { System.out.println(new String(ch,start,length)); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("<"+qName+">"); } }
- 启动main方法测试
测试成功 over
5.3 这两种解析方式的对比
- dom4j
- 优点:
①. 大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。
②. 支持XPath。
③. 有很好的性能。 - 缺点:
①. 大量使用了接口,API较为复杂。
- 优点:
- SAX:
- 优点:
①:不需要等所有数据都被处理完毕,就能立即开始分析。
②:只在读取数据时检查数据,不需要保存在内存中。
③:能在某个条件得到满足的时候停止解析,不用解析整个文档,提高效率。
④:效率和性能较高,能解析大于系统内存的文档。 - 缺点:
①:需要应用程序自己负责TAG的处理逻辑,文档越复杂程序就越复杂。
②:单向导航,无法定位文档层次,难以同时访问同一文档中的不同部分数据,并且不支持XPath。
- 优点:
本节完