- XML 简介
- XML 语法
- XML 组成部分
- XML 约束
- DTD
- 名称解释
- 引用内部的 DTD
- 引用外部的 DTD
- Schema
- 语法格式详解
- 命名空间前缀的意义
- XML 解析
- 解析 XML 的方式(思想)
- 解析器
- JSOUP 的使用
- JSOUP 入门
- 快捷查询
- Jsoup 选择器查询
- XPath
XML,Extensible Markup Language,可扩展标记语言。 可扩展,主要是指标签完全由用户自定义。
功能:存储数据 1.配置文件 2.在网络中传输
xml 与 html 的区别: 1.xml 标签都是自定义的,html 标签是预定义 2.xml 的语法严格,html 语法松散 3.xml 是存储数据的,html 是展示数据
XML 语法语法规则: 1.xml 文档的后缀名.xml 2.xml 第一 行必须定义为文档声明 3.xml 文档中有且仅有一个根标签 4.后性值必须使用引号(单双都可)引起来 5.标签必须正确关闭 6.xml标签名称区分大小写
XML 组成部分1.文档声明
1.1.格式: 1.2.属性列表: version:版本号,必须的属性 encoding:指定解码的字符编码。告知解析引擎需要使用什么字符编码解码文档,默认值: ISO- 8859-1 standalone:是否独立。取值 yes:不依赖其他文件;取值 no:依赖其他文件。这个了解即可。
2.指令 引入 css 文件,用于展示 xml 文件的内容
3.标签 自定义标签名称,命名规则和 HTML 相同
4.属性 id 属性值必须唯一
5.文本 CDATA区:在该区域中的数据会被原样展示
格式:
作为框架的使用者(程序员) : 1.能够在 xml 中引入约束文档 2.能够简单的读懂约束文档 约束分类: 1.DTD:一种简单的约束技术 2.Schema:一种复杂的约束技术
引入 DTD 可以使用两种方式,引用内部定义的 DTD 和引用外部的 DTD 文档。
内部 DTD:将约束规则定义在 XML 文档中 外部 DTD:将约束的规则定义在外部的 DTD 文件中
名称解释#PCDATA:表示元素的内容是普通文本 CDATA:表示属性值的类型是字符串类型 #REQUIRED:表示属性是必须的 ID:表示属性值是唯一的 #IMPLIED:表示属性非必须的,即可有可无
引用内部的 DTD下面的范例就是引用内部的 DTD:
DOCTYPE 书籍列表[
]>
引用外部的 DTD
DTD 可以独立成文档,在 XML 文档中引入 DTD 文档,引入语法格式:
如果 DTD 文件在项目中: 如果 DTD 文件在网络中:
DTD类型: PUBLIC,行业共用的 SYSTEM,系统本地的,自定义的
Schema 语法格式详解xmlns:namespace-prefix="namespace"
,其中的 namespace-prefix
可以省略掉。namespace-prefix
叫做命名空间前缀,其实相当于变量,用来引用某个命名空间。
xmlns
是 XML Namespace 的缩写,译为 XML 命名空间。命名空间可理解为某种资源的别名,用来区分、识别不同的引用资源。
xmlns:xsi
表示使用 xsi
来引用指定的命名空间,而这个 xsi
在 XML 中叫做命名空间前缀。
xsi
是 XML Schema Instance
,含义是 Schema 的实例,Schema 是一种约束技术,所谓实例就是这种技术的具体实现,所以 xsi
是用来引用 Schema 技术的具体实现的。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
表示使用 xsi
引用命名空间 http://www.w3.org/2001/XMLSchema-instance
。
Schema 技术的具体实现有很多,如下图所示:
xsi:schemaLocation
属性定义了 XML Namespace 和 XSD(Xml Schema Definition)文档的对应关系。它的值由一个或多个URL引用对组成,命名空间与 XSD 文件之间,以空格和换行分隔。第一个 URL 是 XSD 文件的 XML Namespace 的值,第二个 URL 则是 Schema 文档的位置,XML 引擎将从这个位置读取 Schema 文档,该文档的 targetNamespace 必须与第一个 URL 相匹配。
xsi:schemaLocation
属性是来自于某个具体的 Schema 技术实现,xsi
则引用某个命名空间,这个命名空间指向某个资源文件。
例如:
xsi
引用 http://www.w3.org/2001/XMLSchema-instance
,http://www.w3.org/2001/XMLSchema-instance
是一种 Schema 的具体技术实现。
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
,xsi:schemaLocation
属性是来自于前缀 xsi
的,而前缀 xsi
引用 http://www.w3.org/2001/XMLSchema-instance
,所以 schemaLocation
属性其实是来自于 http://www.w3.org/2001/XMLSchema-instance
,也就是说在 http://www.w3.org/2001/XMLSchema-instance
中定义了属性 schemaLocation
。
schemaLocation
的值是 http://www.itcast.cn/xml student.xsd
,说明 XML 具体使用的 Schema 定义文档时是 sutdent.xsd
,而且这个文档的命名空间是 http://www.itcast.cn/xml
,那么就可以通过 http://www.itcast.cn/xml
来引用文档 sutdent.xsd
。
xmlns="http://www.itcast.cn/xml"
,这个表示标签没有前缀的情况下默认引用的命名空间是 http://www.itcast.cn/xml
,而这个命名空间指向的是 sutdent.xsd
,所以标签没有前缀的情况下默认使用 sutdent.xsd
中的定义。
刘德华
11
male
张学友
11
male
如上所示,xml 文档中引入两个 Scheme 定义文件,而这两个文件中都定义了标签 、
、
、
,那么你要使用哪个 XSD 文档定义的标签呢?你可以在标签前面加上前缀进行标识,这样 XML 引擎就知道要依据哪个 XSD 进行解析判断了。
操作 XML 文档: 所谓解析,就是读取数据(input/输入),将 XML 文档中的数据读取到内存中。 写入数据(output/输出),就是将内存中的数据保存到 XML 文档中,即所谓的持久化存储。
解析 XML 的方式(思想)1.DOM 将标记语言文档一次性加载进内存中,在内存中形成一棵 DOM 数。适用于服务器等设备
优点:操作非常方便,可以对文档进行 CRUD 的所有操作 缺点:比较消耗内存
2.SAX 逐行读取,基于事件驱动,适用于内存空间小设备,例如:手机
优点:不占内存 缺点:只能读取,不能增删改
解析器根据 DOM 或者 SAX 思想实现的工具包。 1.JAXP:sun 公司提供的解析器,支持 DOM 和 SAX 两种思想,很少使用 2.DOM4J:优秀的解析器,基于 DOM 思想实现,在服务器端常用 3.jsoup:一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。 4.PULL:安卓系统内置的解析器,基于 SAX 思想实现
JSOUP 的使用步骤: 1.导入 jar 包 2.获取 Document 对象,这个对象代表整个 DOM 树结构 3. 获取对应的标签(即 Element 对象) 4. 获取数据
JSOUP 入门package pri.lwx.javaex.xmlex.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
/**
* Jsoup快速入门
*
* @author liaowenxiong
* @date 2021/12/14 11:53
*/
public class JsoupDemo01 {
public static void main(String[] args) throws IOException {
// 获取XML文件的Path
String path = JsoupDemo01.class.getClassLoader()
.getResource("pri/lwx/javaex/xmlex/schema/student.xml")
.getPath();
// 解析XML文档,加载文档进内存,获取dom树(Document对象)
// parse方法需要指定解码的编码格式
Document doc = Jsoup.parse(new File(path), "utf-8");
// 获取元素对象
// getElementsByTag通过标签名获取元素对象集合
// Elements继承自ArrayList
Elements elements = doc.getElementsByTag("name");
// 查看集合的长度
System.out.println("元素集合长度:" + elements.size());
// 获取集合的第一个元素对象
Element element = elements.get(0);
// 获取集合对象中的文本数据
String name = element.text();
System.out.println(name);
}
}
对象的说明: 1.Jsoup 工具类,可以解析 html 或者 xml 文档,返回 Document 对象 parse(File in, String charsetName):解析 XML 和 HTML 文件 parse(String html):解析 HTML 和 XML 字符串 parse(URL url, int timeoutMillis):通过指定的网络资源路径获取对应的文档对象
2.Document 文档对象,代表内存中的dom树 Document 继承自 Element 通过 Document 对象获取 Element 对象或者 Element 对象集合
getElementsByTag(string tagName) :根据标金名称获取元素对家集合 getElementsByAttribute(String key) :根据属性名称获取元素对象集合 getElementsByAttributevalue(String key, String value) :根据属性名和属性值获取元素对象集合 getElementsByClass(String classValue):根据 class 属性值获取元素对象集合 getElementById(String id):根据ID值获取元素对象
3.Elements Element 对象的集合,本质是 ArrayList
4.Element 元素对象 4.1.可以获取子元素对象 4.2.可以获取元素的属性值 public String attr(String attributeKey):根据属性名获取对应的属性值 4.3.可以获取元素的文本内容 public String text():获取元素的文本内容,包含子元素中的文本内容 public String html():获取元素的innerHTML内容,即标签体中所有的内容
5.Node 节点对象,Node 是 Element 的父类
快捷查询 Jsoup 选择器查询public Elements select(String cssQuery)
参考 Selector 类中定义的语法
示例代码:
package pri.lwx.javaex.xmlex.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
/**
* Jsoup的选择器查询
*
* @author liaowenxiong
* @date 2021/12/15 10:19
*/
public class JsoupDemo04 {
public static void main(String[] args) throws IOException {
// 获取xml文件的绝对路径
String path = JsoupDemo04.class.getClassLoader()
.getResource("pri/lwx/javaex/xmlex/schema/student.xml")
.getPath();
// 获取xml文件对应的Document对象
Document document = Jsoup.parse(new File(path), "utf-8");
// 使用标签选择器(类似css的标签选择器)获取所有名称为student的元素
Elements elements = document.select("student");
System.out.println(elements);
System.out.println("-----------------");
// 使用属性值选择器获取所有number属性值为heima_0001的student元素
Elements elements1 = document.select("student[number='heima_0001']");
System.out.println(elements1);
System.out.println("-----------------");
// 使用属性值选择器+后代选择器,获取所有number属性值为heima_0001的student元素所包含的name元素
Elements elements2 = document.select("student[number='heima_0001'] name");
System.out.println(elements2);
System.out.println("-----------------");
}
}
XPath
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。 XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
使用 XPath 需要导入相关的 jar 包:
JsoupXpath-2.5.1.jar slf4j-jdk14-1.6.1.jar slf4j-api-1.7.32.jar antlr4-runtime-4.7.2.jar commons-lang3-3.12.0.jar
主页:https://github.com/zhegexiaohuozi/JsoupXpath 教程:https://www.w3school.com.cn/xpath/index.asp