xml是一种可拓展标记语言,是w3c组织发布的。可拓展就是标签可以自己定义。xml两个版本1.1版本不能向下兼容,1.0使用较多。
xml由软件解析,用户编写(按照说明文档),说明文档有软件开发者提供。
xml与html区别
xml标签都是自定义的,html标签是预定义。
xml的语法严格,html语法松散
xml是存储数据的,html是展示数据
xml应用
- 用于不用系统之间的数据传输
- 用来表示生活中有关系的数据
- 用作配置文件
xml语法
文件后缀名为.xml, 首行文档声明(xml版本号,xml字符编码…)。 属性值必须使用引号引起来
文档声明
1 |
|
PI指令
引入css文件,该文件的样式只对英文标签起作用,对xml中文标签不起作用
1 | <!--引入css样式> |
标签: 自定义
- xml区分大小写
- xml标签不能以数字和下划线开头,不能以xml开头,标签中不能有空格,冒号
- 标签可以嵌套若干子标签,但不允许交叉嵌套
- xml会把空格和换行都当成内容来解析
1 | 包含标签主题:<tmp></tmp> |
属性
1 | <tmp id="1" class="tmp"></tmp> |
文本
普通标签中的文本不能使用特殊字符,需要转义。CDATA区中的数据会被原样展示。
1 | <![CDATA[ |
特殊字符
特殊字符 | < | > | & | ‘ | “ |
---|---|---|---|---|---|
替代符号 | < |
> |
& |
' |
" |
dtd约束
有几个xml元素就定义几个
<ELEMENT>
标签复杂元素(有子元素的元素), 约束元素中包含的子元素
<!ELEMENT 元素名称 (子元素,子元素)>
简单元素, 约束元素为字符类型
<!ELEMENT 元素名称 (#PCDATA)>
约束元素的属性
<!ELEMENT 元素名称 属性名 属性类型
练习
1 | <!ELEMENT students (student*) > <!-- students标签下可以有任意个student标签 --> |
dtd三种引入方式
1 | <!-- 1. xml文件中直接编写(内部dtd) --> |
Schema约束
文件名*.xsd, 是一种复杂约束
引入
- 填写xml文档的根元素
- 引入xsi前缀.
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- 引入xsd文件命名空间
xsi:schemaLocation="http://www.ttt.cn/xml student.xsd"
- 为每一个xsd约束声明一个前缀,作为标识
xmlns="http://www.ttt.cn/xml"
例如
1 | <students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
操作xml
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档中。持久化的存储
解析xml的方式
服务器采用dom的思想,移动端采用SAX思想
DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
优点:操作方便,可以对文档进行CRUD(增删改查)的所有操作
缺点:占内存
SAX:逐行读取,基于事件驱动的。
优点:不占内存。
缺点:只能读取,不能增删改
xml常见的解析器
JAXP
:sun公司提供的解析器,支持dom和sax两种思想, 使用较少。DOM4J
:一款非常优秀的解析器, 服务器端使用多Jsoup
:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。PULL
:Android操作系统内置的解析器,sax方式的。
Jsoup解析器
对象使用
Jsoup
:工具类,可以解析html或xml文档,返回Documentparse方法
:解析html或xml文档,返回Documentparse(File in, String charsetName)
:解析xml或html文件的。parse(String html)
:解析xml或html字符串parse(URL url, int timeoutMillis)
:通过网络路径获取指定的html或xml的文档对象
Document
:文档对象。代表内存中的dom树,Document对象继承了Element对象- 获取Element对象
getElementById(String id)
:根据id属性值获取唯一的element对象getElementsByTag(String tagName)
:根据标签名称获取元素对象集合getElementsByAttribute(String key)
:根据属性名称获取元素对象集合getElementsByAttributeValue(String key, String value)
:根据对应的属性名和属性值获取元素对象集合
- 获取Element对象
Element
:元素对象Elements
:元素Element对象的集合。可以当做ArrayList<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()
: 获取标签体的所有内容(包括子标签的标签体)
Node:节点对象
- 是Element, Document的父类
步骤:
- 导入jar包
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据
练习
1 | // 获取xml文件的Document对象 |
快速选择标签
selector:选择器
使用的
Element
对象中的方法:Elements select(String cssQuery)
语法:参考Selector类中定义的语法
XPath
:XPath即为XML路径语言导入JsoupXpath.jar包。
- 获取
JXDocument
对象JXDocument jxDocument = new JXDocument(document);
- 获取
选择标签
- 使用
JXDocument
对象中的sel, selN, selOne, selNOne
方法
- 使用
例子: 选择student小的age标签
1 | // 获取xml文件的Document对象 |