目录
1XML概述
1.1XML是什么
可扩展的标记(标签)语言,是一门独立的语言,有自己的语法规则。
标记语言:基于一些标签的。例如:<name>玖玖</name>
XML的本质是一个纯文本文件,它的内部是标签+数据。
XML不是自定义标签,而是自定义标签。
1.2XML的应用方向
记录数据
当做配置文件
数据传输
2XML语法
2.1XML语法总述
XML有自己的语法结构。
主要的语法组成:
- 文档声明
- 标签
- 属性
- 注释
- 转义字符
- CDATA区
2.2XML语法-文档声明
一个标准的XML,通常会在0行0列的位置定义一个“文档声明”。
<?xml version = “1.0(或者1.1)" encoding = “UTF-8" ?>
version:版本号
encoding:编码集
文档声明是给XML的编辑器和解析器看的,告诉它们在本页使用哪个版本的语法以及编码。
文档声明不是必须的,但如果要写文档声明必须在0行0列的位置上。
2.3XML语法-元素(标签)
标记即为标签tag(元素element)
- 标签:也叫标记、元素,是定义XML的重要组成部分,我们在数据上都是要带标签的。
- 标签的格式:
- 完整标签:<name>玖玖</name> 成对标签将数据放在中间。
- 单标签(自闭和标签):<person 属性="属性值" age="18"/> 没有标签体。
- 标签的名称只能包含:字母、中文、数字、四个符号(_ - : .),并且数字和符号不能作为开头,标签名称中间也不许有空格。
- 标签是区分大小写的。
- 标签可以嵌套。
2.4XML语法-属性
- 属性:任何标签都可以定义属性。
- 完整标签只可以将属性定义在开始标签。
- 自闭和标签不能将属性定义在"/"之后。
- 属性格式:属性名="值"
- 值 必须用一对双引号或者单引号括起来。
- 一个标签可以定义多个属性,每个属性之间用空格隔开。
- 一个标签中定义的多个属性不能重名。
2.5XML语法-注释
- XML只有一种注释:<!--注释内容-->
- 注释不能写在一个标签名里。
- 注释不能嵌套
2.6XML语法-转义字符
转义字符:可以替换一些特殊符号
例如有个标签,要存储以下内容:
<code>a < b</code>
XML中的转义字符,也叫实体字符,例如
字符 | 预定义的转义字符 | 说明 |
< | < | 小于 |
> | > | 大于 |
" | " | 双引号 |
' | ' | 单引号 |
& | & | 和号 |
2.7XML语法-CDATA区
CDATA区:只要是在CDATA区中的内容,全部认为是文本,没有特殊符号。
格式:
<![CDATA[ 文本 ]]>
作用:如果数据中包含大量的转义字符,对于编写、维护、可读性都产生了副作用,我们可以将数据封装在CDATA区。
2.8XML约束的概念及作用
自定义的XML没有规范,可以任意书写,阅读不方便,并且后期需要根据标签名进行解析,如果任意书写将无法解析。所以我们需要一定的约束。
XML约束:XML应该具有一定的规范,所以以约束来限制XML的书写。
XML约束分为两种
dtd(旧版本约束):比较简单,一些小型的、简单的文档使用。
schema(新版本约束):比较复杂,一些大型的、复杂的文档使用。
XML约束可以约束哪些内容呢:
文档中可以出现哪些标签。
标签之间的包含关系。
标签出现的顺序。
标签出现的频率。
等
3XML解析
3.1XML解析方式介绍
- dom解析:
- 一次性将文档中所有内容读取到内存,并在内存中生成dom树模型。这个模型中记录了所有标签以及他们的层次结构。
- 优点:可以对元素进行增、删操作。
- 缺点:慢、占用内存。
- 只适合小文件。
- sax解析:
- 一次读取一行,解析一行。
- 优点:快、占用内存小。
- 缺点:只能读取文件,没有文档结构,不能进行增删操作。
- pull解析:
- Android的解析方式 SDK
解析器:就是根据不同的解析方式提供的具体实现。有些解析器的操作过于繁琐,为了方便开发人员,提供有益于操作的解析开发包。
3.2解析工具介绍
- JAXP解析:JDK自带的解析工具,比较原始、底层,用起来不是很方便。
- DOM4J解析:应用最广的解析工具,内部结合了dom和sax解析方式。
- JDOM解析:dom4j的兄弟,没有dom4j强大。
- JSOUP解析:对HTML进行解析。
3.3XML解析原理及DOM模型
所有的元素 文本 属性 统统称之为叫节点 node
element 元素
text 文本
attribute 属性
node 节点(所有的内容都是节点)
叶子节点: 最后一层的节点
DOM4J工具将XML文档一次性读取到内存中,并生成“DOM树”:
程序中最终获取的是“Document”对象。我们程序可以通过这个Document对象逐层的获取各级节点。
3.4DOM4J的使用步骤及常用方法
使用dom4j解析需要引入dom4j的jar包。
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="0001">
<name>JavaWeb开发教程</name>
<author>张孝祥</author>
<sale>100.00元</sale>
</book>
<book id="0002">
<name>三国演义</name>
<author>罗贯中</author>
<sale>100.00元</sale>
</book>
</books>
//创建读取对象
SAXReader saxReader = new SAXReader();
//读取xml文件 获得document对象
Document document = saxReader.read(TestDemo.class.getClassLoader().getResourceAsStream("book.xml"));
//获取根元素
Element rootElement = document.getRootElement();
//获取根节点下一级所有元素
List<Element> elements = rootElement.elements();
for (Element element : elements) {
//获取元素的属性值
String id = element.attributeValue("id");
//获取文本数据
String name = element.elementText("name");
String author = element.elementText("author");
String sale = element.elementText("sale");
}
3.5DOM4J结合XPATH解析XML
在dom4j的基础上 封装了一个 xpath技术 , xpath 快速获得我们所需要的内容(xpath是以节点node为核心的内容展开的)
- 我们之前使用dom4j解析xml的方式比较直接:获取Document对象,然后再获取根元素,然后再获取它的各级子、孙元素。这种逐级的获取方式,如果文档很大,解析起来会很费事。
- 使用Xpath的方式解析就比较方便。它的核心思想使用:“路径”的方式来获取一个节点。
- 使用Xpath的方式需要引入jaxen包。
//创建解析工具
SAXReader saxReader = new SAXReader();
//读取xml文件
Document document = saxReader.read(TestDemo.class.getClassLoader().getResourceAsStream("book.xml"));
//获得节点对象
Node node = document.selectSingleNode("/books/book/name");
//获得文本
String text = node.getText();
Xpath语法说明:
/ 从根路径下开始 书写即可 /books/book/name
// 从任意路径下开始(从xml自上而下的顺序)
@ 根据属性获得数据
//创建解析工具
SAXReader saxReader = new SAXReader();
//读取xml文件
Document document = saxReader.read(TestDemo.class.getClassLoader().getResourceAsStream("book.xml"));
/**
* "/books/book/name"
* 参数: 能够匹配到 我们需要的标签内容即可
* 绝对匹配 /根路径下开始/子级路径/子级路径
*
* / 从根路径下开始 书写即可 /books/book/name
* // 从任意路径下开始(从xml自上而下的顺序)
* @ 根据属性获得数据
*/
//获得数据
Node node1 = document.selectSingleNode("/books/book/name");
Node node2 = document.selectSingleNode("//name");
//Node节点 每一个节点也是一个元素
System.out.println(node.getText());
//可以强转成Element对象调用其API
Element element = (Element)node;
System.out.println(element.getText());
Node node = document.selectSingleNode("//author[@name='xxx']");
System.out.println(node.getText());
以上就是部分xml的知识点啦,后续会继续补充。各位大佬如发现有知识点错误或者有不同的建议与意见,欢迎评论、私信指正,本人才疏学浅还需向各位大佬学习,还请不吝赐教!在此感谢各位的观看!谢谢!