JavaWeb——XML
1.XML概念
XML:Extensible Markup Language,可扩展标记语言
可扩展:标签都是自定义的,想写啥写啥,只要符合标签的命名
2.XML功能——存储数据
- XML作为
配置文件
- 数据存起来后可以
在网络中传输
(XML是纯文本的,它和语言和平台都无关)
3.XML和HTML区别
扩展——W3C:万维网联盟,94年创建,发布了许多影响深远的web技术标准及实施指南,其中就 包含XML和HTML
XML和HTML区别
:
- XML标签都是自定义的,HTML标签都是预定义的
- XML语法严格,HTML语法松散
- XML是存储数据的,HTML是展示数据的
4.XML语法
4.1.简单XML代码
在桌面创建一个文件,XML文件的后缀是“.xml”,可以用Notepad打开后写入一段入门的XML代码:
<?xml version = '1.0'?>
<users>
<user id = "1">
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
</user>
<user id = "2">
<name>lisi</name>
<age>22</age>
<gender>female</gender>
</user>
</users>
如何验证自己写的XML代码对不对呢?XML文档可以被所有浏览器解析
,所以浏览器中有对应的XML解析引擎,只要将XML文件放进来不报错,那么就说明XML代码没问题,如下:
4.2.基本语法
- XML文档的
后缀名
“.xml” - 文档第一行(前面不能有空行或空格)必须有
文档声明
- XML文档中有且只有一个
根标签
-
属性值
必须用引号引起来,单双引号都可以` - 必须
正确闭合
,要么自闭和,如
,要么有开始标签有结束标签互相匹配 - XML标签
区分大小写
4.3.组成部分
4.3.1.文档声明
4.3.1.1.格式
<?xml 属性列表?>:注意,问号和xml之间没有空格
4.3.1.2.属性列表
- version:版本号,写1.0,
不写version会报错
- encoding:编码方式,告知解析引擎,当前文档使用的字符集,
默认ISO-8859-1
- standalone:是否独立,有yes(不依赖其他文件)和no(依赖其他文件)两个值,在实际中
很少专门去设置
4.3.2.指令
结合css使用
4.3.3.标签
标签名称自定义,自定义规则
如下:
- 名称可以包含字符、数字以及其他的字符
- 名称不能以数字或标点符号开始
- 名称不能以xml(或XML、Xml等)开始
- 名称不能包含空格
4.3.4.属性
id属性值唯一
4.3.5.文本
特殊字符要转义
,比如大于号小于号等,为了更方便,我们有一个CDATA区,格式如下:
<![CDATA[
要展示的数据
]]>
示例如下:
<code>
<!--编写代码:if(a < b && a > c){}-->
<!--转义-->
if(a < b && a > c){}
<!--CDATA块-->
<![CDATA[
if(a < b && a > c){}
]]>
</code>
4.3.6.注释
<!--注释内容-->
5.XML约束
5.1.约束文档基本概念
谁编写XML?——用户,软件使用者
谁解析XML:——软件
作为我们,需要:
- 能够
在xml中引入
约束文件 - 能够
简单地读懂
(许多开发环境能够自动地根据约束文档提供相应提示,我们只需要简单读懂即可)约束文档
5.2.约束文档的技术实现
市面上的约束文档主要分两类:
- DTD:简单的约束技术
- Schema:比较复杂的约束技术
5.2.1.DTD约束
一个简单的DTD约束文档:
5.2.1.1.DTD的引入
内部的DTD
(不常用)
将约束的规则定义在xml文档中
外部的DTD
将约束的规则定义在外部的DTD文件中,外部DTD分两种:
- 本地:
- 网络:
5.2.1.2.DTD的缺点
约束性不够强
5.2.2.Schema约束
一个简单的Schema约束文档:每个自定义类型都进行了更详细的定义
5.2.2.1.引入Schema约束
- 填写XML文档的根元素
- 引入xsi前缀
- 引入xsd文件命名空间
- 为每一个xsd约束声明一个前缀作为标识
6.XML解析
解析:操作xml文档,将文档中的数据读取到内存中
操作XML文档:
-
解析
(读取):将文档中的数据读到内存中 -
写入
:将内存中的数据保存到XML文档中,持久化的存储
6.1.解析XML的方式:
6.1.1.DOM
DOM:将标记语言文档一次性加载进内存,在内存中形成一棵DOM树DOM优点
:
- 操作方便,可以对文档进行CRUD的所有操作
DOM缺点
:
- 一次性加载所有东西进内存,当文件特别大时,生成的树形结构非常占内存
6.1.2.SAX
SAX:逐行读取,基于事件驱动的SAX优点
:内存中永远只有一行,不占内存,适用于内存较小的设备SAX缺点
:只能读取,不能增删改
6.2.XML常见的解析器
6.2.1.JAXP(使用少)
由Sun公司提供,支持DOM和SAX两种思想
6.2.2.DOM4J(优秀)
基于DOM的优秀解析器
6.2.3.jsoup
一款Java的HTML解析器,可以直接解析某个URL地址、HTML文本内容,它提供了一套非常省力的API,可通过DOM、CSS以及类似于jQuery的操作方法来读取操作数据
6.2.3.1.jsoup快速入门
步骤:
- 导入jar包
- 获取Document对象,代表整个DOM树形结构
获取方法:
- 从一个URL、文件或字符串中解析
- 使用DOM或CSS选择器来查找、取出数据
- 可操作元素、属性、文本
- 获取对应的标签:Element对象
- 获取数据
6.2.3.2.jsoup对象的使用
-
Jsoup
:工具类,解析HTML或XML文档,返回Document,主要了解parse方法
parse:解析解析HTML或XML文档,返回Document
- parse(File in, String charsetName):解析XML或HTML文件的
- parse(String html):解析XML或HTML字符串
- parse(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的对象,比较常见,做爬虫时会用到
-
Document
:继承自Element,是文档对象,代表内存中的DOM树
主要用于获取Element对象:
- getElementById(String tagName):根据ID属性值获取唯一的Element对象(用的不多)
- getElementByTag(String tagName):根据标签名称获取元素对象集合
- getElementByAttribute(String key):根据属性名称获取元素对象集合
- getElementByAttributeValue(String key, String value):根据对应的属性名和属性值来获取元素对象集合
![]()
-
Elements
:元素的Element对象的集合,可以当做ArrayList<Element>
来使用 -
Element
:元素对象,可以获取元素对象、属性值、文本内容等
1.获取子元素对象:
- getElementById(String tagName):根据ID属性值获取唯一的Element对象(用的不多)
- getElementByTag(String tagName):根据标签名称获取元素对象集合
- getElementByAttribute(String key):根据属性名称获取元素对象集合
- getElementByAttributeValue(String key, String value):根据对应的属性名和属性值来获取元素对象集合
2.获取属性值
- String attr(String key):根据属性名称获取属性值
3.获取文本内容
- String text():获取
纯文本内容
- String html():获取标签体的所有内容(包括子标签标签体的字符串内容)
![]()
-
Node
:节点对象,是Document和Element对象的父类
6.2.3.3.jsoup提供的快捷查询方式
-
selector
:选择器,熟知语法的话查询层次较深的内容比较方便
1.使用的方法:Elements select(String cssQuery)
2.语法:参考Selector类中定义的语法
3.一个比较复杂的例子:
-
XPath
:XPath即XML路径语言,它是一种用来确定XML文档中某部分位置的语言
使用jsoup的XPath要
额外导入一个Jar包
,因为XPath虽用于XML查询,但是它本身和XML是相互独立的
查询W3CSchool参考手册使用XPath的语法完成查询
6.2.4.PULL
基于Android操作系统的解析器,SAX方式