XML学习笔记
XML
Extensible Markup Language 可扩展标记语言,于 1998 年 2 月 10 日成为 W3C (万维网联盟)的推荐标准。
1、概念
什么是XML?
- XML 指可扩展标记语言(EXtensible Markup Language)
- XML 是一种标记语言,很类似 HTML
- XML 的设计宗旨是传输数据,而非显示数据
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准
- XML 是不作为的。也许这有点难以理解,但是 XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。
- XML 仅仅是纯文本而已。有能力处理纯文本的软件都可以处理 XML。
XML 与 HTML 的主要差异
- XML 不是 HTML 的替代。
- XML 和 HTML 为不同的目的而设计。
- XML 标签都是自定义的,HTML 标签是预定义。
- XML 被设计为传输和存储数据,其焦点是数据的内容。
- HTML 被设计用来显示数据,其焦点是数据的外观。
- HTML 旨在显示信息,而 XML 旨在传输信息。
- XML 的语法严格,HTML 语法松散
XML 的用途
XML 应用于 web 开发的许多方面,常用于简化数据的存储和共享。
存储数据
- 作为配置文件
- 在网络中传输
2、语法
2.1、基本语法
- xml文档的后缀名 .xml
- xml第一行必须定义为文档声明
- xml文档中有且仅有一个根标签
- 属性值必须使用引号(单双都可)引起来
- 标签必须正确关闭
- xml标签名称区分大小写
2.2、快速入门
<?xml version="1.0" encoding="UTF-8" ?>
<users>
<!--属性值必须使用引号(单双都可)引起来-->
<user id="1">
<name>张三</name>
<age>23</age>
<gender>male</gender>
</user>
<!--单个标签必须自闭合-->
<br/>
<user id="2">
<name>李四</name>
<age>11</age>
<gender>male</gender>
</user>
</users>
1、组成部分
1、文档声明
- 格式:
<?xml 属性列表 ?>
- 属性列表:
- version:版本号,必须的属性
- encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
- standalone:是否独立
- 取值:
- yes:不依赖其他文件
- no:依赖其他文件
- 取值:
2、指令(了解)
结合css的
<?xml-stylesheet type="text/css" href="a.css" ?>
3、标签
标签名称自定义的
规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
4、属性
-
id属性值唯一
-
属性值必须被引号包围,不过单引号和双引号均可使用。
-
如果属性值本身包含双引号,可以使用单引号,或者可以使用字符实体
<gangster name='George "Shotgun" Ziegler'> <gangster name="George "Shotgun" Ziegler">
-
属性难以阅读和维护。请尽量使用元素来描述数据。
-
因使用属性而引起的一些问题:
- 属性不能包含多个值(元素可以)
- 属性不能包含树结构(元素可以)
- 属性不容易扩展(为未来的变化)
<!--第一个实例中使用了 date 属性:--> <note date="10/01/2008"> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> <!--第二个实例中使用了 date 元素:--> <note> <date>10/01/2008</date> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> <!--第三个实例中使用了扩展的 date 元素(推荐):--> <note> <date> <day>10</day> <month>01</month> <year>2008</year> </date> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
5、文本
CDATA区:在该区域中的数据会被原样展示
- 格式:
<![CDATA[ 数据 ]]>
- CDATA 部分不能包含字符串
]]>
。也不允许嵌套的 CDATA 部分。 - 标记 CDATA 部分结尾的
]]>
不能包含空格或换行。
<![CDATA[
function matchwo(a,b){
if (a < b && a < 0) then{
return 1;
} else{
return 0;
}
}
]]>
6、命名空间
XML 命名空间提供避免元素命名冲突的方法。
1、使用前缀来避免命名冲突
在 XML 中的命名冲突可以通过使用名称前缀从而容易地避免。
该 XML 携带某个 HTML 表格和某件家具的信息:
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table xmlns:f="http://www.w3cschool.cc/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3cschool.cc/furniture">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
2、xmlns 属性
-
当在 XML 中使用前缀时,一个所谓的用于前缀的命名空间必须被定义。
-
命名空间是在元素的开始标签的 xmlns 属性中定义的。
-
命名空间声明的语法如下。xmlns:前缀="URI"。
-
命名空间,可以在他们被使用的元素中或者在 XML 根元素中声明
-
命名空间 URI 不会被解析器用于查找信息。其目的是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间
指向实际存在的网页,这个网页包含关于命名空间的信息。
2.3、约束
规定xml文档的书写规则
作为框架的使用者(程序员):
- 能够在xml中引入约束文档
- 能够简单的读懂约束文档
约束分类:
-
DTD:一种简单的约束技术,引入dtd文档到xml文档中,会对程序员书写xml时进行约束作用
<!ELEMENT students (student+) > <!-- 标签名students,至少放1个student子标签 --> <!ELEMENT student (name,age,sex)> <!-- student标签有三个子标签,按顺序出现,有且只有一次 --> <!ELEMENT name (#PCDATA)> <!-- 字符串格式 --> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ATTLIST student number ID #REQUIRED> <!-- 声明student的一个属性名为ID(唯一),类型number,必须出现 -->
-
内部dtd:将约束规则定义在xml文档中
<!DOCTYPE students [ <!ELEMENT students (student+) > <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ATTLIST student number ID #REQUIRED> ]>
-
外部dtd:将约束的规则定义在外部的dtd文件中
-
本地:
<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
<!DOCTYPE students SYSTEM "student.dtd">
-
网络:
<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
-
-
-
Schema:一种复杂的约束技术(Spring会用到)
XML Schema 教程 | 菜鸟教程 (runoob.com)
引入:
- 填写xml文档的根元素
- 引入xsi前缀。
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
- 引入xsd文件命名空间。
xsi:schemaLocation
="http://www.itcast.cn/xml student.xsd"
- 为每一个xsd约束声明一个前缀,作为标识。
xmlns
="http://www.itcast.cn/xml"
<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">
2.4、解析
操作xml文档,将文档中的数据读取到内存中
1、操作xml文档
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档中。持久化的存储
2、解析xml的方式
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
- 优点:操作方便,可以对文档进行CRUD的所有操作
- 缺点:占内存
- 主要用于服务器端
- SAX:逐行读取,读一行,释放一行,基于事件驱动的。
- 优点:不占内存。
- 缺点:只能读取,不能增删改
- 主要用于移动端
3、xml常见的解析器
-
JAXP:sun公司提供的解析器,支持dom和sax两种思想,比较烂,很少有人用
-
DOM4J:一款非常优秀的解析器
-
Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过
DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
-
PULL:Android操作系统内置的解析器,sax方式的。
4、Jsoup
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
JSoup快速入门 - 易百教程™ (yiibai.com)
1、快速入门
- 步骤:
- 导入jar包
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据
<?xml version="1.0" encoding="UTF-8" ?>
<users>
<user id="1">
<name>张三</name>
<age>23</age>
<gender>male</gender>
</user>
<!--单个标签必须自闭合-->
<br/>
<user id="2">
<name>李四</name>
<age>11</age>
<gender>male</gender>
</user>
</users>
public class JsoupDemo1 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1获取Document对象,根据xml文档获取
//1.1 获取user.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("users.xml").getPath();
//1.2 解析xml文档,加载文档进内存,获取dom树,指定解析字符集
Document document = Jsoup.parse(new File(path), "UTF-8");
//2 获取元素对象集合 Elements
Elements elements = document.getElementsByTag("name");
//3 获取第一个name的Element对象
Element element = elements.get(0);
//4 获取数据
String name = element.text();
System.out.println(name);
}
}
2、对象的使用
① Jsoup:工具类,可以解析html或xml文档,返回Document
parse:解析html或xml文档,返回Document
- parse(File in, String charsetName):解析xml或html文件的。如上
- parse(String html):解析xml或html字符串
- parse(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档对象,常见,爬虫
② Document:文档对象。代表内存中的dom树
主要用于获取Element对象
- getElementById(String id):根据id属性值获取唯一的element对象
- getElementsByTag(String tagName):根据标签名称获取元素对象集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
③ Elements:元素Element对象的集合。可以当做 ArrayList<Element>
来使用
④ Element:元素对象
-
获取子元素对象
- getElementById(String id):根据id属性值获取唯一的element对象
- getElementsByTag(String tagName):根据标签名称获取元素对象集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
-
获取属性值
- String attr(String key):根据属性名称获取属性值
-
获取文本内容
- String text(): 获取所有子标签的纯文本内容
- String html(): 获取标签体的所有内容(包括子标签的标签和文本)
⑤ Node:节点对象
是Document和Element的父类
3、快捷查询方式
① selector:选择器
语法:参考Selector类中定义的语法,跟CSS选择器类似
使用的方法:select(String cssQuery) 返回Elements
public class JsoupDemo3 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1获取Document对象,根据xml文档获取
//1.1 获取user.xml的path
String path = JsoupDemo3.class.getClassLoader().getResource("users.xml").getPath();
//1.2 解析xml文档,加载文档进内存,获取dom树
Document document = Jsoup.parse(new File(path), "UTF-8");
//2 查询name标签
Elements elements = document.select("name");
System.out.println(elements);
//3 查询id为2的元素
Elements elements1 = document.select("#2");
System.out.println(elements1);
}
}
② XPath
XPath即为XML 路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
- 使用 Jsoup 的Xpath需要额外导入jar包。
jsoup-1.11.2.jar
和JsoupXpath-0.3.2.jar
都需要导入 - 查询w3cshool参考手册,使用xpath的语法完成查询 XPath 教程 | 菜鸟教程 (runoob.com)
- XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
代码举例:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book id="2">
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
public class JsoupDemo4 {
public static void main(String[] args) throws IOException, ClassNotFoundException, XpathSyntaxErrorException {
//1获取Document对象,根据xml文档获取
//1.1 获取bookstore.xml的path
String path = JsoupDemo4.class.getClassLoader().getResource("bookstore.xml").getPath();
//1.2 解析xml文档,加载文档进内存,获取dom树
Document document = Jsoup.parse(new File(path), "UTF-8");
//2 根据document对象,创建JXDocument对象
JXDocument jxDocument = new JXDocument(document);
//3 结合Xpath语法查询
//4 查询id=2的book的price值
//方法1
//4.1 获取id=1的book节点,因为selN返回的是List,所以要get(0)
JXNode jxNode = jxDocument.selN("//book[@id=2]/price").get(0);
//4.2 将JXNode对象转为Element对象,再调用方法
Element element = jxNode.getElement();
String text = element.text();
System.out.println(text);//39.95
//方法2
Object price = jxDocument.selOne("//book[@id=2]/price/text()");
System.out.println(price);//39.95
}
}
路径表达式 | 结果 |
---|---|
bookstore |
选取 bookstore 元素的所有子节点。 |
/bookstore |
选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
bookstore/book |
选取属于 bookstore 的子元素的所有 book 元素。 |
//book |
选取所有 book 子元素,而不管它们在文档中的位置。 |
bookstore//book |
选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 |
//@lang |
选取名为 lang 的所有属性。 |
/bookstore/* |
选取 bookstore 元素的所有子元素。 |
//* |
选取文档中的所有元素。 |
//title[@*] |
选取所有带有属性的 title 元素。 |
/bookstore/book[1] |
选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] |
选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] |
选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()<3] |
选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] |
选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang='eng'] |
选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] |
选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]//title |
选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book/price/text() |
选取 price 节点中的所有文本 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了