XML
一、概念
可扩展的标记语言
1、功能
存储数据:可以用作配置文件、在网络中传输
2、xml与html的区别
- xml标签都是自定义的,html标签都是预定义的
- xml的语法严格,html语法松散
- xml是存储数据的,html是展示数据的
二、语法
1、基本语法
- xml文档的后缀名必须为.xml
- xml第一行必须定义为文档声明
- xml文档中有且仅有一个根标签
- 属性值必须使用引号(单引号双引号都行)引起来
- 标签必须正确关闭
- xml标签区分大小写
2、组成部分
(1)文档声明
① 格式<?xml 属性列表 ?>
② 属性列表
- version:版本号,该属性为必须属性
- encoding:编码方式。告知解析引擎当前文件使用的字符集
- standalone:是否独立
取值为:yes或者no,如果为yes则不依赖其他文件,如果为no则依赖其他文件
(2)指令:结合css控制xml标签的样式
<?xml-stylesheet type="text/css" href="你的css的路径" ?>
(3)标签:
命名规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
可使用任何名称,没有保留的字词。
(4)属性
id属性值唯一,表示元素的唯一表示,但是这个id并不一定是id=什么什么
(5)文本
特殊字符需要用转义符进行转义
CDATA区:在该区域内的数据会被原封不动的展示出来
格式如下:
<![CDATA[ 想要展示的数据 ]]>
3、约束
规定xml文档的书写规则
我们只要能够在xml引入约束文档、能够简单的读懂约束文档就行
约束文档的分类
(1)DTD:一种简单的约束技术
① 外部引入dtd方式:
将约束的规则定义在外部的dtd文件中
分为本地外部约束和网络外部约束
本地外部约束:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
网络外部约束:<!DOCTYPE 根标签名 PUBLIC "dtd文件的名字" "dtd文件的URL位置">
② 内部dtd的引入方式
将dtd文件定义在xml文档中
*dtd文档约束的缺陷
无法设置标签内容中的数据的正确合理性,内容可以随意填写
(2)Schema:一种复杂的约束技术
引入:
- 填写xml文档的根元素
- 引入xsi前缀
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"这是一个固定的格式,取值有很多,但是这里我们使用2001的,这里我们引入了之后,就可以通过xsi引入地址 - 引入xsd文件命名空间
xsi:schemaLocation="命名空间 你的schemea文件的路径":双引号当中的命名空间是随意起的,是给后面的schemea文件的路径起的名字 - 为每一个xsd约束声明一个前缀,作为表示
xmlns:前缀名="命名空间"
如果前缀名不写的话,那么默认表示空前缀,什么都不用写
注意这里的命名空间起的名字,后面的所有标签都需要加上这个前缀,如果单独声明了命名空间的前缀,那么只需要在每个标签前加上声明的前缀即可
三、解析
解析就是操作xml文档,将文档中的数据读取到内存当中
1、操作xml文档
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档中。持久化的存储
2、解析xml的方式
(1)DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
- 优点:操作方便,可以对文档进行增删改查的操作
- 缺点:因为是一次性加载进内存,所以当xml文档很大的时候加载进来十分的占用内存
(2)SAX:逐行读取,基于事件驱动
- 优点:不占内存
- 缺点:只能读取,不能增删改
3、xml常见的解析器
- JAXP:sun公司提供的解析器,支持dom和sax两种思想
- DOM4J:一款非常优秀的解析器
- Jsoup:jsoup是一款Java的HTML解析器,可以直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可以通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据
- PULL:Android操作系统内置的解析器,是一种sax方式的解析器
四、Jsoup使用
1、使用步骤
- (1)导入jar包
- (2)获取Document对象
- (3)获取对应的标签Element对象
- (4)获取数据
举例示范
xml文件内容

jsoup使用步骤示范

2、Jsoup中对象的介绍
(1)Jsoup:工具类,可以解析hetml或者xml文档,返回Document
parse:解析xml或者html文件的方法,返回Document,他有很多的重构方法
parse(File in,String charsetName):解析xml或者html文件的parse(String html):解析xml或者html字符串parse(URL url,int timeoutMillis):通过url路径获取指定的html或者xml文档对象,第二个参数代表设置超时时间,超过这个时间没有访问到,就停止访问,该方法多用于-网络爬虫的使用
(2)Document:文档对象,代表内存当中的dom树
getElementById(String id):根据id属性值获取唯一的element对象getElementsByTag(String tagName):根据标签名称获取元素对象集合getElementsByAttribute(String key):根据属性名称获取元素对象集合getElementsByAttributeValue(String key,String Value):根据对应的属性名和属性值获取元素对象集合
举例说明
xml文件内容

① 获取属性名为id的元素对象们

控制台输出的结果为:

②获取number属性值为heima_0001的元素对象

控制台输出的结果为

③ 获取id属性值的元素对象
控制台输出的结果为:

(3)Elements:元素Element独享的集合。我们可以把它当作ArrayList<Element>来使用
(4)Element:元素对象
获取子元素对象
getElementById(String id):根据id属性值获取唯一的element对象getElementsByTag(String tagName):根据标签名称获取元素对象集合getElementsByAttribute(String key):根据属性名称获取元素对象集合getElementsByAttributeValue(String key,String Value):根据对应的属性名和属性值获取元素对象集合
获取属性值
String attr(String key):根据属性名称获取属性值
获取文本内容
String text():获取文本内容String html():获取标签体内的所有内容,包括字体子标签中的字符串和标签本身
举例说明:
xml文档中的内容如下

①通过Document对象获取name标签,能获取到所有name标签,如果通过name的父类的document对象来获取name标签的话,只能获取到该父类的子类标签

可以看出通过docemnt获取到了两个name,而通过父类只获取到了他的子类的那一个name

②获取student对象的属性值

得到的结果为

③获取文本内容

得到的结果为

如果将xml文档中的内容改成,如下

那么再次执行该代码,获取的内容就是这样

由此可以看出通过html()获取和text()获取的区别
(5)Node:节点对象
是Document和Element的父类
3、快捷查询的方式
(1)selector:选择器查询
使用方法:Element select(String cssQuery)
语法:参考Selector类中定义的语法
举例说明:
xml文档中的内容如下

① 快捷查询name标签

② 快捷查询id为itcast的元素

③ 获取student标签并且number属性值为heima_0001的标签

④获取student标签并且number属性值为heima_0001的age的子标签

(2)XPath:
XPath即为XML路径语言,他是一种用来确定xml(标准通用标记语言的子集)文档中某部分位置的语言
注意:
- 使用Jsoup的Xpath需要额外带入jar包
- 查询w3school参考手册,使用xpath的语法完成查询
- 我们需要通过构造方法
new JXDocument(document对象)来创建JXDocument对象
举例说明
xml文档内容如下

① 结合xpath语法查询所有student标签


② 查询所有student标签下的name标签


④ 查询student标签下带有id属性的name标签


⑤ 查询student标签下带有id属性的name标签,并且id属性值为itcast



浙公网安备 33010602011771号