XML&Dom4j学习与介绍

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标签命名的要求

  1. 严格区分大小写: 不行
  2. 标签名不能以数字开头,只能以字母或下划线开头,可以是中文: <9miao></9miao>不行
  3. 标签名不能包含空格: </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的两种约束

  1. DTD约束(简单,弱)
  2. Schema约束(复杂,强)
DTD约束的概念:

DTD概念: Document Type Definiation 文档类型定义

DTD作用:约束XML中只能出现某些数据

导入DTD文件的两种格式说明
<!DOCTYPE 根元素 SYSTEM “DTD文件”>本地的约束,适合个人,公司小范围的使用的约束
<!DOCTYPE 根元素 PUBLIC “文件描述” “DTD文件”>网络上的约束,适合大范围的使用
Schema约束:

DTD的不足:

  1. 不能验证数据类型
  2. 因为DTD是一个文本文件,本身不能验证是否正确。

Schema约束文件扩展名(XML Schema Definition)XML模式定义:xsd

约束文件本身也是XML文件,所以也有根元素,根元素的名字叫:schema

XML的两种解析方式:

两种解析方式

  1. DOM解析
  2. SAX解析
SAX解析:
  • 优点:事件驱动型解析方式,读取一行就解析一行,释放内存。理论上可以解析任意大小的XML文件。
  • 缺点:使用过的元素不能再访问了,不能修改元素,只能查找。
DOM解析原理:

Document Object Model 文档对象模型

DOM 将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作。以下面books.xml文档为例。

DOM解析优缺点

优点:将整个XML文件加载到内存中,生成一棵DOM树。随意访问树上任何一个节点,可以修改和删除节点,程序开发比较方便。

缺点:占内存,如果XML文件很大,可能出现内存溢出。

1564409084353.png)]

dom4j: 获取Document对象和根元素:

导入dom4j的步骤:

  1. 去官网下载 zip 包。http://www.dom4j.org/
  2. 在项目中创建一个文件夹:lib
  3. 将dom4j-2.1.1.jar文件复制到 lib 文件夹
  4. 在jar文件上点右键,选择 Add as Library -> 点击OK
  5. 在类中导包使用
得到Document对象:

文件Contact.xml放在src目录下

  1. 创建一个SAXReader对象,用于读取 xml 文件
  2. 从类路径下加载xml文件,得到输入流对象
  3. 通过 SAXReader对象的read(InputStream in )方法,从输入流中读取,生成文档对象

1564409430152.png

调用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表达式分类

  1. 绝对路径

  2. 相对路径

  3. 全文搜索

  4. 属性查找

Node对象:

DOM树中的每个节点就是Node

dom4j中与XPath相关的方法

注:使用XPath需要另外导入 jaxen-1.1.2.jar包

Node对象的方法功能说明
Node selectSingleNode(String xpath)通过xpath得到一个节点
List selectNodes(String xpath)通过xpath得到一组节点

绝对路径语法:

1564410571280

1564410626045.png)]

相对路径

1564410713755
1564411096392

全文搜索:

1564410837183.png)]

举例说明
//contact找contact元素,无论元素在哪里
//contact/name找contact,无论在哪一级,但name一定是contact的子节点
//contact//namecontact无论在哪一种,name只要是contact的子孙元素都可以找到

1564410889758
属性查找:

1564410928132
------------------------------- |
| //contact | 找contact元素,无论元素在哪里 |
| //contact/name | 找contact,无论在哪一级,但name一定是contact的子节点 |
| //contact//name | contact无论在哪一种,name只要是contact的子孙元素都可以找到 |

属性查找:

1564410975419

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值