XML概述:
概念:
可扩展的标记语言。
功能:
- 作为数据本地存储的格式。(已淘汰)作为结构化存储的方式,不如数据库效率高。目前一部分移动设备中还在使用。
- 作为网络中传输数据的格式。(已淘汰)作为网络传输的格式,在目前以移动互联网为主的环境中,格式太大,所以已被JSON格式替代。
作为配置文件的格式存储配置信息(主要功能)
语法
文本
内部的数据会忽略特殊字符,原样输出<[CDATA[ 数据 ]]>
约束
定义xml文档中可以出现的标签、属性及取值范围等限制条件
作用:
开发阶段,我们都是引入别人写好的约束文件使用。
报错:当我们编写或属性写错时可以有友好的提示
开发时的代码提示:提升开发效率。
约束分类:
dtd(逐渐淘汰)老牌的约束技术,有独立的语法。限制规则比较少
schema(新兴)在约束文档中
约束文档:
xmlns:xsd="http://www.w3.org/2001/XMLSchema"定义当前文档为约束文档,可以指定约束的规则
targetNamespace目标名称空间, 用于指定当前文档的名称空间。类似于java代码中的package关键字。
此处一旦定义了名称空间,那么在实例文档中引入当前约束文件时,必须指定该名称空间。
实例文档:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"定义当前文档为实例文档,表示当前文档是被约束的,使用约束文件
xsi:schemaLocation="http://shinnippori.lofter.com/xml Aniki.xsd"引入名称空间http://shinnippori.lofter.com/xml,
实例文档中,除了w3c的约束之外,第三方自定义的约束,必须指定约束文件的地址Aniki.xsd(这里恰好是在一层目录内)。
格式:在schemaLocation中,依次编写key和value,key为名称空间的全名,value为约束文件的路径
如:
这里的名称空间/命名空间http://shinnippori.lofter.com/xml不是URL,是URI。
xml为了避免元素冲突,可以给元素加一个特别的前缀,但是必须给这个前缀定义一个命名空间,也就是必须用xmlns属性给这个前缀加一个特别的名字。这个名字必须是个URI。解析器不会用这个URI来查找信息,所以它可以是没有意义的,但实际上企业通常把命名空间指向一个真的含有相关信息的网址。
并可以为该名称空间起一个别名。xmlns:Shinnippori="http://shinnippori.lofter.com/xml"
一个xml中可以引入多个约束文件。类似于java中的import
一个xml中,最多可以有一个名称空间可以省略别名的定义。
xml解析
解析方式
1. dom
把文档加载进内存生成一颗dom树。
优点:
可以增删改查
速度比较快
缺点:
占用内存比较多,并不适用于内存比较紧张的环境。
2. sax
逐行加载
优点:
占用内存非常少,每次只加载一行数据
缺点:
只可以读取数据
速度比较慢
实际上,很多xml解析的工具,在实现时,会同时采用这两种解析方式。
JSOUP
1. Jsoup:工具类,返回Document
parse:解析html或xml文档,返回Document
parse(File in, String charsetName):解析xml或html文件的。
parse(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档对象
2. Document:代表内存中的dom树,所有的元素节点都在document中
getElementXXXX
这一系列的方法用于获取dom树中的元素节点。
3. Element
Document对象实际上是继承自Element。
获取元素的属性
attr()
获取元素的标签体
text()
html()
快捷查找元素的方式
1. 选择器
Element中使用Elements select(String selector)
selector的语法和css的选择器语法保持一致
使用选择器方式获取xml中的元素,这种方式不通用。
2. Xpath*****
xml通用的解析方式
使用方式:
先把document对象转为JXDocument
使用JXDocument的selN()或者selNOne()查找元素
这两个方法的参数为xpath的字符串
/ 代表绝对路径
// 代表无论层级下的路径
* 通配符,代表所有
/AAA/BBB[1]
中括号中可以指定某个集合中的编号,从1开始
/AAA/BBB[last()]
获取集合的最后一个
//BBB[@id]
指定带有某个属性的元素
//BBB[@id='b1']
选择某个属性等于指定值的元素
返回的是List<JXNode>或者JXNode,JXNode可以直接调用getElement转为原始的Element对##