一. Xml概述
(1)什么是xml: 它是可扩展的标记语言。
可扩展:xml文档里面的标签可以随意书写(满足规范)
标记语言:通过标签编写xml文档。
什么是html:它是超文本标记语言
超文本:超出了文本的范畴,在html文档里面可以定义文本,图片,音频等
标记语言:html文档是通过标签编写的。
(2)区别:
1. Xml标签可以随意写,html的标签是预定义好的,不能随意书写
2. Html用途展示页面给用户看的,
3. Xml用途:存储和管理数据的(体现应用场景:作为配置文件)
(3)Xml语法规范:
1. 文档声明必须在第一行第一列(在第一行的顶格)
2. Xml文档只有一个跟标签
3. Xml的属性值一定要用引号引起来(建议使用双引号)
Xml的组成:文档声明+指令(不用)+标签+属性+文本。
注意:
1. 标签命名:不能以数字开头,不能包含特殊字符。
2. 文本原样展示:<![CDATA[ 代码 ]]>
二. Xml的约束(了解)
(1)什么是xml的约束:
制定一系列的规定(预定义好标签和属性),规范了在xml文档里哪些标签可以书写以及哪些属性可以书写。
(2)约束分两类
* DTD约束:语法比较简单,但是规范不是很严格和细化
*Schema约束:语法比较复杂,但是规范非常严格和细化
三. 解析xml(读取xml文件的数据)
(1) xml解析的思想
注意:操作标签时(增删改),原则通过父标签操作子标签
Dom解析方式
特点:一次性把整个标记性文档(xml),加载到内存了,形成一个dom树型结构,
所以说在内存中保留了标签的子父级关系。
比如:
<users>
<user id=”001” name=”jack”>
</users>
优点:由于保留完成的父子标签关系,所以可以对标签进行增删改操作。
缺点:由于一次性加载整个标记性文档,比较占内存
Sax解析方式
特点:基于事件驱动读取内存中的xml文档,读取一行,丢弃一行,所以说在内存中没有保留标签的子父级关系。
缺点:由于没有保留子父级标签的关系。所以无法增 删 改标签操作
优点:读一行,丢弃一行,不占内存
(2) 常见的解析xml的技术
基于dom思想解析的技术
1. Jaxp: sun公司提供的技术
2. Jdom:第三方的技术
3. Dom4j: 第三方技术(主要解析xml)
4. Jsoup:第三方技术(特长:解析html,也可以解析xml)
基于sax思想的解析技术
Pull解析:第三方的技术
(3) Jsoup解析xml
操作步骤:
1. 导入jsoup的jar包
2. 通过类加载器获取xml文件的绝对路径
3. 根据xml文件的绝对路径得到File对象,然后得到Document对象
4. 根据Document对象操作xml文档,可以获取xml文档的任意标签
5. 根据得到的标签对象可以操作标签的属性和文本。
(4)核心api
1. JSOUP工具类:
parse(file ,charsetName): 解析本地的xml或者html文件。
parse(url,long mills): 解析网络上的html文件(爬虫)
2. Document对象(表示一个文档),作用:获取文档上的元素
* 获取名称为name的所有标签的集合:getElementsByTag(“name”);
* 根据id获取单个标签对象:getElementById(“id的属性值”);
* 根据属性名称获取标签对象的集合:getElementsByAttribute(“属性名称”);
3. Element对象(表示文档的标签对象)
* 获取属性的值: String value = attr(“属性的名称”);
* 获取标签体的纯文本内容:text();
* 获取标签体的内容:html();
5.选择器(理解)
(1)选择器:快速的筛选具有相似特征的标签,快速的定位到所需的标签。
(2)选择器有使用方式
* Jsoup自带选择器功能:选择器类似css选择器。
* select(选择器参数);
(3)Jsoup结合的xpath(选择器):
* 注意:
1.导入与xpath的jar包
2. 调用方法:selectN(xpath语法),
SelectOne(xpath语法);
注意:xpath语法只能定位到一个标签
常见的xpath语法:
//name: 查询所有name标签对象
比如:
<users>
<name>jack</name>
<user>
<name>lisi</name>
</user>
</users>
/根标签/name: 只查询根标签下的子标签name
比如:
<users>
<name>jack</name>
<user>
<name>lisi</name>
</user>
</users>
//@id: 查询具有id属性的标签
比如:
<users>
<name id=”n1”>jack</name>
<user id=”n2”>
<name>lisi</name>
</user>
</users>
//name[@id]: 查询具有id属性的name标签
比如:
<users>
<name id=”n1”>jack</name>
<user id=”n2”>
<name id=”n3”>lisi</name>
</user>
</users>
//name[@id=’n3’]:查询id=n3的name标签
比如:<users>
<name id=”n1”>jack</name>
<user id=”n2”>
<name id=”n3”>lisi</name>
</user>
</users>
|
|