typora-root-url: XML&Dom4j.assets
typora-copy-images-to: XML&Dom4j.assets
XML&Dom4j
能够说出Dom4j常用的类:
组成 | 说明 |
---|---|
Document | 文档对象 |
Node | 节点 |
Element | 元素 |
Attribute | 属性 |
Text | 文本 |
Node和Element可以相互强制转换类型
XML:
eXtensible Markup Language 可扩展标记语言
特性:
- 可扩展:所有的标记都是自定义的,由程序员自己去扩展。
- 标记语言:整个文件由标记组成,类似于 HTML。不同于编程语言
XML 作用:
XML 在企业开发中主要有两种应用场景:
数据交换:可以用于不同的语言或不同的系统之间进行数据的交换。
[外链图片转存
配置文件:用于框架或工具的配置文件,这也是我们后期主要使用到的功能。
编写XML步骤:
XML由七种元素构成:
文档声明:
作用: 告诉打开这个文件的软件,这是一个XML文件.
<?xml version="1.0" encoding="GBK"?>
注意:以<?xml开头, 以 ?>结尾
必须放在第一行
文档声明的三个属性 | 说明 |
---|---|
version | 指定XML文件使用的版本,取值是1.0 |
encoding | 当前XML文件使用的编码(字符集) UTF-8/GBK |
standalone | 指定当前这个XML文件是否是一个独立的文件,省略的,默认是独立文件。 |
版本说明:
W3C在1988年2月发布1.0版本,2004年2月又发布1.1版本,因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。在2004年2月W3C又发布了1.0版本的第三版。我们学习的还是1.0版本。
元素:
元素就是标签。
<person>武则天</Person>
<元素名>: 起始标签
</元素名>: 结束标签
没有内容的标签可以省略
<元素名></元素名> -> <元素名/>
XML标签命名的要求
- 严格区分大小写: 不行
- 标签名不能以数字开头,只能以字母或下划线开头,可以是中文: <9miao></9miao>不行
- 标签名不能包含空格: </na me> 不行
根标签
没有其他标签包含的就是根标签
[外链图片转存失败(img-1KMYXoiJ-1565854711663)(XML&Dom4j.assets\1564405456827.png)]
属性:
XML文档中属性格式:
<元素名 属性名=“属性值”></元素名>
注释:
<!--注释内容-->
快捷键: ctrl + /
实体字符:
因为很多符号已经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用实体字符
字符数据区:CDATA
为什么要字符数据区:如果大量使用实体字符,会导致XML可读性降低。另一种解决方案:可以使用字符数据区包裹这些字符,只要在字符数据区中的内容,XML解析器会以纯文本进行解析。
<![CDATA[文本数据]>>
<![CDATA[
if(a > 10){
System.out.println("你好");
}
]>>
<!DOCTYPE b SYSTEM "a.dtd"> 相当于java中的导包,引入约
处理指令:
<!DOCTYPE b SYSTEM "a.dtd">相当于java中的导包
XML约束:
XML为什么要有约束
因为XML文件的标签和属性可以随意扩展,有时我们必须要限制每个文档有哪些元素,每个元素有哪些子元素,每个元素有哪些属性,属性的值是什么类型等。**通过XML约束可以保证XML文件中的数据的正确性**
XML的两种约束
- DTD约束(简单,弱)
- Schema约束(复杂,强)
DTD约束的概念:
DTD概念: Document Type Definiation 文档类型定义
DTD作用:约束XML中只能出现某些数据
导入DTD文件的两种格式 | 说明 |
---|---|
<!DOCTYPE 根元素 SYSTEM “DTD文件”> | 本地的约束,适合个人,公司小范围的使用的约束 |
<!DOCTYPE 根元素 PUBLIC “文件描述” “DTD文件”> | 网络上的约束,适合大范围的使用 |
Schema约束:
DTD的不足:
- 不能验证数据类型
- 因为DTD是一个文本文件,本身不能验证是否正确。
Schema约束文件扩展名(XML Schema Definition)XML模式定义:xsd
约束文件本身也是XML文件,所以也有根元素,根元素的名字叫:schema
XML的两种解析方式:
两种解析方式:
- DOM解析
- SAX解析
SAX解析:
- 优点:事件驱动型解析方式,读取一行就解析一行,释放内存。理论上可以解析任意大小的XML文件。
- 缺点:使用过的元素不能再访问了,不能修改元素,只能查找。
DOM解析原理:
Document Object Model 文档对象模型
DOM 将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作。以下面books.xml文档为例。
DOM解析优缺点
优点:将整个XML文件加载到内存中,生成一棵DOM树。随意访问树上任何一个节点,可以修改和删除节点,程序开发比较方便。
缺点:占内存,如果XML文件很大,可能出现内存溢出。
)]
dom4j: 获取Document对象和根元素:
导入dom4j的步骤:
- 去官网下载 zip 包。http://www.dom4j.org/
- 在项目中创建一个文件夹:lib
- 将dom4j-2.1.1.jar文件复制到 lib 文件夹
- 在jar文件上点右键,选择 Add as Library -> 点击OK
- 在类中导包使用
得到Document对象:
文件Contact.xml放在src目录下
- 创建一个SAXReader对象,用于读取 xml 文件
- 从类路径下加载xml文件,得到输入流对象
- 通过 SAXReader对象的read(InputStream in )方法,从输入流中读取,生成文档对象
调用getRootElement()方法得到根元素:
Element rootElement = document.getRootElement();
元素对象Element
方法名 | 功能说明 |
---|---|
String getName() | 得到元素名字 |
Element element(String name) | 得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个 |
List elements() | 得到当前元素下所有子元素 |
List elements(String name) | 得到当前元素下指定名字的子元素返回集合 |
属性对象Attribute:
Attribute对象:
Attribute对象:下面contact就是属性对象
<contact id="1" vip="true">
Element中的方法 | 功能说明 |
---|---|
String attributeValue(String name) | 通过属性名直接得到属性值 |
Attribute attribute(String name) | 通过属性名得到属性对象 |
List attributes() | 得到当前元素所有的属性对象 |
dom4j: 获取文本内容
Element元素中的方法 | 说明 |
---|---|
String getText() | 得到元素中文本 |
String elementText(元素名) | 得到子元素中文本 |
String elementTextTrim(元素名) | 得到子元素中文本,去掉先后空格 |
注意:空格、换行、制表符:也是属于文本的一部分,所以在解析xml文件的时候,格式化XML文件要注意。
dom4j中与XPath表达式有关的方法
作用:在XML中通过路径表达式可以很方便的得到我们需要的内容,让XML解析更加简单
XPath表达式分类:
-
绝对路径
-
相对路径
-
全文搜索
-
属性查找
Node对象:
DOM树中的每个节点就是Node
dom4j中与XPath相关的方法:
注:使用XPath需要另外导入 jaxen-1.1.2.jar包
Node对象的方法 | 功能说明 |
---|---|
Node selectSingleNode(String xpath) | 通过xpath得到一个节点 |
List selectNodes(String xpath) | 通过xpath得到一组节点 |
绝对路径语法:
.png)]
相对路径:
全文搜索:
.png)]
举例 | 说明 |
---|---|
//contact | 找contact元素,无论元素在哪里 |
//contact/name | 找contact,无论在哪一级,但name一定是contact的子节点 |
//contact//name | contact无论在哪一种,name只要是contact的子孙元素都可以找到 |
属性查找:
------------------------------- |
| //contact | 找contact元素,无论元素在哪里 |
| //contact/name | 找contact,无论在哪一级,但name一定是contact的子节点 |
| //contact//name | contact无论在哪一种,name只要是contact的子孙元素都可以找到 |
属性查找: