XML
1. 基本概念
2. 语法
3. 如何解析
* 基本概念:extension Markup Language 可扩展标记性语言
1. 可扩展:标签都是自定义的。
2. 功能:
* 存储数据
1. 配置文件
2. 在网络中传输
3. xml与html的区别
1. xml标签都是自定义的,html标签是预定义的。
2. xml语法严格,html语法松散
3. xml是存储数据的,html是展示数据的
*语法:
* 基本语法:
1. xml文档的后缀名 .xml
2. xml第一行必须是文档申明
3. xml文档中有且仅有一个根标签(严格满足树的结构,只有一棵树)
4. 属性值必须用引号(单双都可以),引起来
5. 标签必须正确关闭
6. xml标签区分大小写
* 快速入门:
* <?xml version="1.0" ?>
<users>
<users>
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
</users>
<users>
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
</users>
</users>
* 组成部分:
1. 文档申明
* 格式:
* <?xml 属性列表 ?>
* 属性列表:
* version:版本号,必须的属性
* encoding:编码方式,告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
* standalone:是否独立--->是否依赖于其他文件
2. 指令:(了解):用于展示数据的(现在已经不用了)
3. 标签:标签名自定义的
* 数字和标点符号不能用来开头
* 不能以字母xml及其大小写来开头
* 名称不能包含空格
4. 属性
* id值唯一
5. 文本
* 特殊符号必须使用相关的符号,来代替表示
* 比如,<使用&it来代替
* CDATA区:该区域的数据会被原样展示
* 格式: <![CDATA[ 需要写入的文本信息 ]]>
*约束(约束文档,第一步,必须看懂文档中的标签层次; 第二步,就是对具体数据的约束范围)
1. 谁编写xml? --> 用户,软件使用者(程序员)——————>在xml的约束文件下编写xml。
2. 谁解析xml? ---> 软件(半成品,框架)
3. 约束:规定xml文档的书写规则(就是规定了xml需要怎么写去匹配他的程序)
* 作为框架的使用者(程序员):
1. 能够在xml中引入约束文档
2. 能够简单的读懂约束文档
* 分类:
1. DTD:一种简单的约束技术(缺陷对数据的输入内容不能约束,后缀名" .dtd")
2. Schema:一种复杂的约束技术(后缀名" .xsd")
* DTD:
* 引入dtd文档到xml中
* 内部dtd:将约束规则定义在内部的xml中
* 外部dtd:将约束的规则定义在外部的dtd文件中
* 本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的名字"> (约束文件引入xml中)
* 网络:<!DOCTYPE 根标签名 SYSTEM "dtd文件名字" "dtd文件的位置URL"> (将网络端的约束文件引入xml中)
* Schema:
* 引入文档的要求:
1. 引入xml根标签
2. 引入xsi前缀 (这个相当于using namespae std,系统默认前缀)xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3. 引入xsd文件命名空间. xsi:schemalocation="http://www.itcast.cn/xml student.xsd" 其中http://www.itcast.cn/xml只是一个前缀来命名空间,类似于c++中的空间的概念(这里在初始化空间,创建空间)
* 条件3格式:xsi:schemalocation="空间的名字 地址信息(相对地址或绝对地址)"
4. 为每一个xsd约束申明一个前缀,作为标识 如 xmlns="http://www.itcast.cn/xml" ; 如果在使用过程中没有条件4这步,就必须在所有相关标签前加上http://www.itcast.cn/xml这个前缀,就如同c++中没有使用using namespae ***时一样。
* 条件4的使用格式:xmlns:替代值(这个可以不写,不写时默认为空)="http://www.itcast.cn/xml",(其中和namespace相同,xmlns全称就是xml namespace)
* 空间的名称的引入的意义是在当同时引入多个schema文档时用作区分用的
* 解析:操作xml文档,文档中的数据读取到内存中
* 操作xml文档
1. 解析(读取):将文档中的数据读取到内存中
2. 写入:将内存中的数据保存到xml中。持久性存储
* 解析xml的方式:
1. DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树。
* 有点:操作方便。可以对文档进行CRUD操作
* 缺点:占内存
2. SAX:逐行读取,基于事件驱动。 (常用于移动端)
* 优点:不占内存
* 缺点:只能读取,不能CRUD
* xml常见解析器:
1. JAXP:sun公司提供的解析器,支持dom和sax两种思想
2. DOM4J:一款非常优秀的解析器
3. jsoup:jsoup是一款java的HTML解析器,可以直接解析某个URL地址,HTML文本内容。它提供了一套非常省力的API,可以直接通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。
4. PULL:Android操作系统内置的解析器,sax方式。
* Jsoup解析器
* 快速入门:
* 步骤:
* 导入相关jar包
* 获取Document对象
* 获取对应的标签Element对象
* 获取数据
* 代码
//1.获取Document对象,根据xml文档获取
//1.获取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("xml/dtd/jsoup/student.xml").getPath();
//2.2 解析xml文档,加载文档进内存,获取dom树---->Document
Document document = null;
try {
document = Jsoup.parse(new File(path), "utf-8");
} catch (IOException e) {
e.printStackTrace();
}
//3获取元素对象 ElementsElements elements = document.getElementsByTag("name");
System.out.println(elements.size());
//3.1获取第一个name标签的Element对象
Element nameElement = elements.get(0);
//3.2获取数据
String name = nameElement.text();
System.out.println(name);
*对象的使用:
1. Jsoup:工具类,可以解析html和xml文档,返回Document
* 方法:parse
* 重载1:parse(File in, String charsetName):解析xml或html
* 重载2:parse(String html):解析xml或html字符串(就是必须传入xml或html内容作为字符串传入)
* 重载3:parse(URL url,int timeoutMills)通过网络路径进行指定的html或xml的文档对象。 timeoutMills指定查询超过这个时间就报错。
* URL代表网络中的一个资源
* 重载4:parse(File file,String charsetName) File代表的是一个配置文件,初始化是传入配置文件地址;charsetName是其编码方式。
2. Document:文档对象。代表内存中的dom树
* 主要是用来获取Element对象
* getElementsByTag(String tagName):根据标签名称获取元素集合(通过标签名来获取属性名称)
* getElementsByAttribute(String key):根据属性名称获取元素对象集合(通过属性名来获取Elements对象)
* getElementsByAttributeValue():根据对应的属性名和属性值来获取元素对象集合。(通过属性值和属性,来获取Elements对象)
* getElementsById(String id):根据id来获取元素集合(这个的属性的名称必须是id,通过属性id的属性值的不同来获得唯一的Element对象)--》这个返回的是Element对象
3. Elements:元素Element对象的集合。可以当做ArryList<Element>来使用,(就是得到一个Element对象集合,就是Elements)
4. Element:元素对象。(由于Document继承自Element所以,Document的四个方法,Element对象也可以使用)(在强化一个概念:此元素下,子元素的获取办法)
* 获取子元素对象:(到时候有可能我们获得的Element不一定就是最小的结构,因此我们需要再进行操作对其在细分)
* getElementsByTag(String tagName):根据标签名称获取元素集合(通过标签名来获取属性名称)
* getElementsByAttribute(String key):根据属性名称获取元素对象集合(通过属性名来获取Elements对象)
* getElementsByAttributeValue():根据对应的属性名和属性值来获取元素对象集合。(通过属性值和属性,来获取Elements对象)
* getElementsById(String id):根据id来获取元素集合(这个的属性的名称必须是id,通过属性id的属性值的不同来获得唯一的Element对象)--》这个返回的是Element对象
* 获取属性值
* String attr(String key):根据属性名称获取属性值(获取指定属性的属性值)
* 获取文本内容
* String text(): 获取文本内容。(此标签下的子标签,不会被输出,但子标签的文本内容会被输出)
* String html():获取标签体的所有内容(包括字标签的字符串内容:此标签下的子标签,所有内容会被输出,包括文本和子标签本身)
5. Node:对象。
* Document和Element的父类
* 快捷查询方式
1. selector:选择器(Document下)
* 使用的方法:Elements select(String cssQuery)
* 参数:直接输入默认是用标签名
* 以#开始字符串,是以属性值为查询条件
* 这个字符串输入相关语法,就会执行相关的查询动作
* 语法:
2. XPath:
* XPath即为xml路径语言,它是一种用来确定xml(标准通用标记语言的子集)文档中某部分位置的语言(就是用来查找的一种语法)
* 使用Jsoup的XPath需要额外导入jar包
* 创建Document对象
* 将Document对象作为参数传入构造器,创建JXDocument对象
* 在根据其方法,结合其语法进行查询。(其语法类似于目录查询的方式进行的)
* 其中List<JXNode>代替了Elements的地位
* JXNode代替了Element