XML概述
- 概念:Extensible Markup Language 可扩展标记语言
- 可扩展:标签都是自定义的。
- 功能:
- 存储数据
- 作为配置文件
- 在网络中传输
- 存储数据
- XML与HTML:
- 都是w3c(万维网联盟)的产物
- xml的标签都是自定义的,html的标签是预定义的;
- xml的语法严格,html的语法松散;
- xml是存储数据的,html是展示数据的。
基本语法
- xml文档的后缀名为
xml
; - xml文档的第一行定义为文档声明。
- xml中有且仅有一个根标签。
- 属性值必须用引号(单双均可)引起来。
- 标签必须正确关闭(要么是围堵标签,要么是自闭和标签);
- xml标签名称区分大小写。
组成部分
- 文档声明
- 格式:
<?xml 属性列表 ?>
- 属性列表:
- version:版本号,必须的属性;
- encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
- standalone:是否独立,一般不会用
- yes:不依赖于其他文件
- no:依赖其他文件
- 格式:
- 指令
- 示例:
<?xml-stylesheet type="text/css" href="a.css">
- 示例:
- 标签
- 名称可以含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符 “xml”(或者 XML、Xml)开始
- 名称不能包含空格
- 属性
- id属性值唯一
- 文本
- CDATA区:在该区域中的数据会被原样展示
- 格式:
<![CDATA[需要展示的数据]]>
- 格式:
- CDATA区:在该区域中的数据会被原样展示
约束
- 约束:规定XML文档的书写规则
- XML与约束之间的关系图:
- 分类:
- DTD:简单的约束技术
- Schema:复杂的约束技术
- DTD:
- 参考资料
- 约束文件名的后缀为
.dtd
- 引入dtd文档到xml文档中,之后如果xml的书写不满足dtd文档的规范,则会报错。
- 内部dtd:将约束规则定义在xml文档中
- 样式;
<!DOCTYPE 根标签名 [dtd约束规则内容]>
- 样式;
- 外部dtd:将约束的规则定义在外部的dtd文件中
- 本地:
<!DOCTYPE 根标签名 SYSTEM "dtd文件在本机的位置(相对路径)">
- 网络:
<!DOCTYPE 根标签名 PUBLIC "dtd在本地的文件名""dtd文件在网络的位置(URL)">
- 本地:
- 内部dtd:将约束规则定义在xml文档中
- 无法规定标签内的内容
- Schema:
- 参考资料
- 是DTD的替代者,可以规定标签体内的内容格式。
- Schema文档的后缀名为
.xsd
- 在xml文档中引入Schema文档:
- 填写xml文档的的根元素
- 引入xsi前缀:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
,后面的内容又很多种选择,可以根据ide的提示内容来选择。 - 引入xsd文件的命名空间:
xsi:schemaLocation="http://www.w3school.com.cn note.xsd"
前面的内容可以自定义,后面的内容是xsd文件名 - 为每一个xsd约束声明一个前缀,作为标识:
xmlns="http://www.w3school.com.cn
或者xmlns:a="http://www.w3school2.com.cn
,如果没有指定前缀的话则默认为空前缀。 - 引入的每个xsd文件对应一个前缀,该xsd文件内的标签在使用时必须带上该xsd文件的前缀,(空前缀除外)。如:
<students></students>
和<a:students></a:students>
解析
- 对xml文档的操作:
- 解析(读取):将文档中的数据读取到内存中。
- 写入:将内存中的数据保存到xml文档中,持久化的存储。
- 解析xml的方式:
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗DOM树。
- 优点:操作方便,可以对文档进行CRUD的所有操作。
- 缺点:因为一次性读取,且DOM树占内存,所以十分消耗内存。
- SAX:逐行读取,基于事件驱动的。
- 优点:不占内存
- 缺点:只能读取,不能CRUD。
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗DOM树。
- XML常见的解析器:基于不同的解析的方式写出来的工具包。
- JAXP:sun公司提供的解析器,支持DOM和SAX思想,不常用。
- DOM4J:非常优秀的基于DOM思想的解析器。
- Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。也可以用来解析XML。
- PULL:Android操作系统内置的解析器,基于SAX思想。
Jsoup
快速入门
- 步骤:
- 导入jar包
- 在官网下载jar包
- 获取Document对象
- 获取对应xml的路径:
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
即:String path = 类名.class.getClassLoader().getResource("xml文档名").getPath();
- 解析xml文档,加载文档进内存,获取DOM树(对应Document对象):
Document document = Jsoup.parse(new File(path),"utf-8");
即:Document document = Jsoup.parse(new File(path),"和xml文档一致的字符集");
- 获取对应xml的路径:
- 获取对应的标签(Element对象)
Elements elements = document.getElementsByTagName("student");
- 获取数据
- 获取元素对象:
Elements elements = document.getElementsByTag("name");
即:Elements elements = Document对象名.getElementsByTag("标签名");
- Elements是一个类似集合的对象,它里面会依次存好符合条件的所有元素对象。
- 获取指定对象:
elements.get(0);
- 获取指定对象,如:
elemets.get(0).text();
- 获取指定对象:
- 获取元素对象:
- 导入jar包
- 示例:
package xml.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
public class JsoupDemo1 {
public static void main(String[] args) throws IOException {
//1.获取Document对象
//1.1获取xml文件的路径
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
//1.2获取Document对象
Document document = Jsoup.parse(new File(path), "UTF-8");
//2.获取对应的xml标签
Elements e = document.getElementsByTag("student");
System.out.println(e.text());
}
}
对象的使用
- Jsoup:工具类,可以解析html或xml文档,返回Document对象
- parse方法:解析html或者xml文档,返回Document对象
parse(File in ,String charseName)
:解析本地的xml或html文件parse(String html)
:解析xml或者html字符串;parse(URL url, int timeoutMills);
:通过网络路径获取指定的html或xml的文档对象。(可以用来爬虫)- timeoutMills:指的是超时时间,如果超过这个时间还没有响应的话则认为获取失败。
- parse方法:解析html或者xml文档,返回Document对象
- Document:文档对象,代表内存中的DOM树
- 用于获取任意Element对象:
getElementById(String id)
:根据id属性值获取唯一的element对象;getElemnetsByTag(String tagName)
:根据标签名称获取元素对象集合;getElementsByAttribute(String key)
:根据属性名称获取元素对象的集合getElementsByAttributeValue(String key, String value)
:根据对应的属性名和属性值获取元素的集合。
- 用于获取任意Element对象:
- Elements:元素ELement对象的集合,可以当作
ArrayList<Element>
来使用 - Element:元素对象
- 同样的方法但是只能获取当前元素的子元素对象:
getElementById(String id)
:根据id属性值获取唯一的element对象;getElemnetsByTag(String tagName)
:根据标签名称获取元素对象集合;getElementsByAttribute(String key)
:根据属性名称获取元素对象的集合getElementsByAttributeValue(String key, String value)
:根据对应的属性名和属性值获取元素的集合。
- 获取属性:
String attr(String key)
:根据属性名称获取属性值
- 获取文本内容:
String text()
:获取文本内容;String html()
:获取标签体的所有内容(包括子标签的字符串内容)
- 同样的方法但是只能获取当前元素的子元素对象:
- Node:节点对象。
- 是Document和Element的父类。
快速查询
selector:选择器
- 使用的方法:
Elements select(String cssQuery)
; - 语法:
- cssQuery是将css选择器的写法,写到一个字符串中,可以类比css选择器理解
- 参照jsoup-javadoc中的网页文档查找selector理解。
- 示例:
//查询name标签
Elements elements = document.select("name");
//查询id值为zhangjie的元素
ELements elements = document.select("#zhangjie");
//获取student标签并且number属性值为java的age子标签
//1.获取student标签并且number属性值为java
Elements elements = document.select("student[number=\"java\"]");
//2.获取age子标签
Elements elemetns = document.select("student[number=\"java\"] > age");
XPath
- XPath是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。
- 使用Jsoup的xpath需要额外jar包:JsoupXpath-x.x.x.jar
- 使用步骤:
- 获取Document对象
- 根据Document对象创建JXDocument对象:
JXDocument jxDocument = new JXDocument(document);
- 集合xpath语法查询
List<JXNode> jxNodes = jxDocument.selN("xpath语法");
- 示例:
//查询所有student标签
List<JXNode> jxNodes = jxDocuement.selN("//student");
//查询所有student标签下的name标签
List<JXNode> jxNodes = jxDocument.selN("//student/name");
//查询student标签下带有id属性的name标签且id属性值为zhangjie
List<JXNode> jxNodes = jxDocument.selN("//student/name[@id='zhangjie']);