文章目录
- XML 简介
- XML 语法
- XML 组成部分
- XML 约束
- DTD
- 名称解释
- 引用内部的 DTD
- 引用外部的 DTD
- Schema
- 语法格式详解
- 命名空间前缀的意义
- XML 解析
- 解析 XML 的方式(思想)
- 解析器
- JSOUP 的使用
- JSOUP 入门
- 快捷查询
- Jsoup 选择器查询
- XPath
XML 简介
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.格式:<?xml 属性列表 ?>
1.2.属性列表:
version:版本号,必须的属性
encoding:指定解码的字符编码。告知解析引擎需要使用什么字符编码解码文档,默认值: ISO- 8859-1
standalone:是否独立。取值 yes:不依赖其他文件;取值 no:依赖其他文件。这个了解即可。
2.指令
引入 css 文件,用于展示 xml 文件的内容
<?xml-stylesheet type="text/css" href="demo.css" ?>
3.标签
自定义标签名称,命名规则和 HTML 相同
4.属性
id 属性值必须唯一
5.文本
CDATA区:在该区域中的数据会被原样展示
格式:<![CDATA[ 数据 ]]>
XML 约束
作为框架的使用者(程序员) :
1.能够在 xml 中引入约束文档
2.能够简单的读懂约束文档
约束分类:
1.DTD:一种简单的约束技术
2.Schema:一种复杂的约束技术
DTD
引入 DTD 可以使用两种方式,引用内部定义的 DTD 和引用外部的 DTD 文档。
内部 DTD:将约束规则定义在 XML 文档中
外部 DTD:将约束的规则定义在外部的 DTD 文件中
名称解释
#PCDATA:表示元素的内容是普通文本
CDATA:表示属性值的类型是字符串类型
#REQUIRED:表示属性是必须的
ID:表示属性值是唯一的
#IMPLIED:表示属性非必须的,即可有可无
引用内部的 DTD
下面的范例就是引用内部的 DTD:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="demo.css"?>
<!DOCTYPE 书籍列表[<!-- 定义一个标签,名称叫"书籍列表",里面包含标签"武侠小说"和"computer_book",并且"武侠小说"和"computer_book"可以出现任意个(≥0)--><!ELEMENT 书籍列表 (武侠小说*,computer_book*)><!-- 定义一个标签,名称叫武侠小说,里面包含标签书名、作者、价格、册数、简介,要求出现的顺序必须一致,而且每个标签只能有1个,而且必须有--><!--作者+,表示作者标签可以有1个或者多个--><!--简介?,表示简介标签可以有0个或者1个--><!ELEMENT 武侠小说 (书名,作者+,价格,册数,简介?)><!ELEMENT computer_book (book_name,author,price,copies,profile)><!--(phone|mobile)*,表示可以出现phone或者mobile,或者两者都出现,可以出现多次--><!ELEMENT 作者 (name,(phone|mobile)*)><!ELEMENT name (#PCDATA)><!ELEMENT phone (#PCDATA)><!ELEMENT mobile (#PCDATA)><!ELEMENT 书名 (#PCDATA)><!ELEMENT 价格 (#PCDATA)><!ELEMENT 简介 (#PCDATA)><!ELEMENT 册数 (#PCDATA)><!ELEMENT book_name (#PCDATA)><!ELEMENT author (#PCDATA)><!ELEMENT price (#PCDATA)><!ELEMENT copies (#PCDATA)><!ELEMENT profile (#PCDATA)><!--表示武侠小说标签有属性isbn,且是必须的。REQUIREd表示必须,IMPLIED非必须,ID表示属性值唯一;有属性hot,默认值false--><!ATTLIST 武侠小说isbn CDATA ID #REQUIREddate CDATA #REQUIREdhot CDATA "false">]>
引用外部的 DTD
DTD 可以独立成文档,在 XML 文档中引入 DTD 文档,引入语法格式:
如果 DTD 文件在项目中:<!DOCTYPE 根标签名 SYSTEM "DTD文件的路径">
如果 DTD 文件在网络中:<!DOCTYPE 根标签名 PUBLIC "DTD文件名称" "DTD文件的URL">
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
则引用某个命名空间,这个命名空间指向某个资源文件。
例如:
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.itcast.cn/xml"xsi:schemaLocation="http://www.itcast.cn/xml student.xsd">
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
中的定义。
命名空间前缀的意义
<?xml version="1.0" encoding="UTF-8" ?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.itcast.cn/xml"xmlns:a="http://www.itcast.cn/xml2"xsi:schemaLocation="http://www.itcast.cn/xml student.xsdhttp://www.itcast.cn/xml2 student2.xsd"><student number="heima_0001"><name>刘德华</name><age>11</age><gender>male</gender></student>
<!--这个student标签使用的是student2.xsd的定义--><a:student number="heima_0002"><a:name>张学友</a:name><a:age>11</a:age><a:gender>male</a:gender></a:student>
</students>
如上所示,xml 文档中引入两个 Scheme 定义文件,而这两个文件中都定义了标签 <student>
、<name>
、<age>
、<gender>
,那么你要使用哪个 XSD 文档定义的标签呢?你可以在标签前面加上前缀进行标识,这样 XML 引擎就知道要依据哪个 XSD 进行解析判断了。
XML 解析
操作 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文件的PathString 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继承自ArrayListElements 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<Element>
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