XML(可扩展标记语言)
1.概念 :
- Extensible Markup Language : 可扩展标记语言
- 可扩展 : 标签都是自定义的. 可以自己设置标签名
- 功能 : 存储数据
- 1.作为配置文件
- 2.在网络中传输
- xml 和 html的区别
- 早期只有html , 由于浏览器厂商之间的竞争 , 导致浏览器解析html的时候没有太大限制 , 基本上语法随便写就有浏览器能够解析 , 造成html的语法十分松散 , 没有限制
- 后来W3C联盟 , 推出了xml , 一个语法非常严格的标记语言 , 最开始是和html进行竞争 , 但是因为html语法很松散 , 所以xml并没有对html造成太大压力
- 再后来 , xml开始与properties配置文件 , 进行竞争 , 用来存放数据这些功能
- 总结 :
- 1.xml标签都是自定义的 , html标签是预定义的
- 2.xml语法十分严格 , html语法松散
- 3.xml 是存储数据的 , html 是展示数据的
2.语法
(1)基本语法 :
- 1.XML的后缀名是 xml
- 2.XML的**第一行(空行了但是在文档中是第一行也不行)**必须定义为 文档声明 : <?xml version='1.0' ?>
- 3.XML文档中有且仅有一个根标签 (所有的标签都是这个标签的子标签)
- 4.属性值必须使用 " " 或 ’ ’ 引起来
- 5.标签必须要有结束标签 或者是一个自闭和的标签 : 如 :
- 6.XML标签的名称区分大小写
<?xml version='1.0' ?>
<!--版本-->
<users>
<user id='1'>
<name>zhangsan</name>
<age>23</age>
<genter>male</genter>
</user>
<user id='2'>
<name>lisi</name>
<age>24</age>
<genter>male</genter>
</user>
</users>
- 只要将xml文件拖到浏览器中 , 浏览器能够解析就是没有问题
-
(2)组成部分 :
1.文档声明
- ①格式 : <?xml version='1.0' ?>
- ②属性列表 :
- version : 版本号 (必须的属性)
- encoding : 编码方式 告知解析引擎 当前文档使用的字符集
- 默认值为 ISO-8859-1
- 设置的值 必须要和文档中写的编码方式一致 , 不然就会报错
- standalone : 是否独立
- 默认 独立 : yes
- yes : 独立 不依赖其他文件
- no : 依赖于其他文件 (约束文件)
2.指令(了解)
-
结合css使用的
-
<?xml-stylesheet type='text/css' href='a.css' ?> <!--引入css的样式 , href里边填写css文件的文件名-->
3.标签
- 标签的名称是自定义的
- 规则 :
- 名称可以包含字母 , 数字 , 以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 , xml (或者XML , Xml等)开始
- 名称不能包含空格
4.属性
- id属性值唯一
5.文本
-
特殊字符 , 要使用转义字符来表示
-
不想要写转义字符的话 , 就要使用 CDATA区 来包裹
-
<自定义> <![CDATA[ if(a < b && a > c){} ]]> </自定义>
3.约束
- 谁编写xml —用户 , 软件使用者 (框架使用者 程序员)
- 谁解析xml —软件 (半成品软件 , 框架)
-
约束 : 规定xml文件的书写规则 ,
- 作为框架的使用者 (程序员):
- 能够在xml中引入约束文档
- 能够简单的读懂约束文档
(2)分类 :
①DTD : 一种简单的约束技术 (后缀为 .dtd)
-
引入DTD文档到xml文档中
-
内部DTD , 将约束规则定义在xml文件中
-
<!DOCTYPE 根标签名 [ dtd的约束内容 ]>
-
-
外部DTD , 将约束的规则定义在外部的dtd文件中
-
本地的 : 在xml文档的第二行 :
-
<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
-
-
网络中的 :
-
<!DOCTYPE 根标签名 PUBLIC "dtd文件的名字" "dtd文件的位置">
-
-
根标签就是dtd文件中定义的 (也就是xml的根标签名)
-
-
-
缺点 : 数据没有限制 , 能够随便书写
② Schema : 一种复杂的约束技术 (后缀为 .xsd)
-
相对于DTD , Schema做出了更加严格的约束技术 ,
-
严格规定了 数据的类型 , 数量 , 内容 等条件
-
引入 :
-
1.填写xml文档的根元素
-
//1.引入xsi前缀 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" //2.引入xsd文件命名空间 (student.xsd前边的一串相当于起一个别名) xsi:schemaLocation="http://www.sichen.cn/xml student.xsd" //3.为每一个xsd约束声明一个前缀 , 作为标识 xmlns:(跟自己命名的标记 , 在以后使用的时候 , 使用那个约束 ,就可以直接使用 (命名的标记:) 来标记自己想要使用这个约束的标签 )="http://www.sichen.cn/xml"
-
-
解析 : 操作xml文档 , 将文档中的数据读取到内存中
- 操作xml文档
- 解析(读取) : 将文档中的数据读取到内存中
- 写入 : 将内存中的数据保存到xml文档中 , 持久化的存储
- 操作xml文档
-
解析xml的方式
- 1.DOM : 将标记语言文档一次性加载进内存 , 在内存中形成一颗DOM树
- 优点 : 操作比较方便 , 可以对文档进行CRUD所有操作
- 缺点 : 这个树要比文档内存占用大概1000到10000倍之间 , 非常占用内存
- 2.SAX : 逐行读取 , 基于事件驱动的
- 读一行释放一行 , 这样内存中只有一行的内存 ,
- 事件驱动 , 当读取到一个开始标签的时候 , 读取的标签种类不同 , 执行的事件方法不同
- 优点 : 不占内存 : 适用于一些内存较小的地方
- 缺点 : 只能读取 , 不能写入
- 1.DOM : 将标记语言文档一次性加载进内存 , 在内存中形成一颗DOM树
4.xml常见的解析器
(1)常见解析器
(1) JAXP : SUN公司提供的解析器 , 支持dom和sax 两种思想
(2) DOM4J : 一款非常优秀的解析器
(3) Jsoup : 本来是用来解析html文档的 , 但是也用来解析xml
(4) PULL : Android 操作系统内置的解析器 , sax方式的
(2)Jsoup解析器 :
步骤 :
- 1.导入jar包
- 2.获取Document对象
- 3.获取对应的标签Element对象
- 4.获取数据
package 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;
import java.net.URISyntaxException;
/**
* Jsoup快速入门
*/
public class JsoupDemo1 {
public static void main(String[] args) throws IOException, URISyntaxException {
//2.获取Document对象 , 根据文档获取对象
//2.1 获取jsoup_demo1.xml文件的path
String path = JsoupDemo1.class.getClassLoader().getResource("jsoupdemo1.xml").toURI().getPath();
//2.2解析xml文档 , 加载文档进内存 , 获取dom树 , ---> document
Document document = Jsoup.parse(new File(path), "utf-8");
//3.获取元素对象 , Element对象
Elements elements = document.getElementsByTag("name");
//这里的elements可以当做一个list看待
for (Element element : elements) {
//获取每一个的文本数据 , 并打印
System.out.println(element.text());
}
}
}
对象的使用 :
-
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文档对象 , 访问路径加超时时间
方法二 : String str = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" + "<users>\n" + " <user id=\"1\">\n" + " <name>思尘</name>\n" + " <age>23</age>\n" + " <genter>男</genter>\n" + " </user>\n" + "</users>"; Document document = Jsoup.parse(str);
方法三 : 可以用来爬取网页数据 URL url = new URL("https://baike.so.com/doc/6847312-7064737.html"); Document document = Jsoup.parse(url , 3000);//3000是超时时间
-
-
Document : 文档对象 , 代表内存中的dom树
-
获取Element对象
-
- getElementById(String id) : 根据id获取元素对象 - getElementsByTag(String tagName) : 根据标签名称获取元素对象集合 - getElementsByAttribute(String key) : 根据属性名称来获取元素对象集合 - getElementsByAttributeValue(String key , String value) : 根据对应的属性名和属性值来获取元素对象集合
-
-
-
Elements : 元素 Element对象的集合 , 可以当做ArrayList来使用
-
Element : 元素对象
-
1.获取子元素对象
-
- getElementById(String id) : 根据id获取元素对象 - getElementsByTag(String tagName) : 根据标签名称获取元素对象集合 - getElementsByAttribute(String key) : 根据属性名称来获取元素对象集合 - getElementsByAttributeValue(String key , String value) : 根据对应的属性名和属性值来获取元素对象集合
-
2.获取属性值 :
- String attr(String key) :根据属性名称获取属性值
- 不区分大小写
-
3.获取文本内容 :
- String text() : 获取文本内容 (获取的是所有子标签的纯文本内容)
- String html() : 获取标签体的所有内容 (包括子标签的字符串内容)
-
-
Node : 节点对象
- 是Document 和Element 的父类
快捷查询方式 :
多个标签嵌套的的时候 , 想要找到对应的标签是很麻烦的 ,
1.selector : 选择器
-
使用方法 : Elements select(String cssQuery)
-
语法 : 和css的语法几乎没什么区别
//查询所有name标签 Elements name = document1.select("name"); System.out.println(name); //查询 id值为2的元素 Elements select = document1.select("#2"); //查询user标签 , 并且id值等于2的 age 的内容 Elements select1 = document1.select("user[id='2'] > age");
-
2.XPath : xml路径语言
专门用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言 ,
-
注意 : 使用Jsoup的XPath需要额外的导jar包
-
查询w3school参考手册 , 使用XPath的语法完成查询
-
<dependency> <groupId>cn.wanghaomiao</groupId> <artifactId>JsoupXpath</artifactId> <version>0.3.2</version> </dependency>
-
查询所有的指定的标签 , 不考虑它的位置
-
//括号内的标签前加两个斜杠 // List<JXNode> jxNodes = jxDocument.selN("//genter");
-
查询所有student标签下的name标签
-
List<JXNode> jxNodes1 = jxDocument.selN("//user/name");
-
查询user标签下带有 id 属性的name标签
-
List<JXNode> jxNodes = jxDocument.selN("//user/name[@id]");
-
查询user标签下带有 id 属性的name标签 , 且id属性值为2的标签
-
List<JXNode> jxNodes = jxDocument.selN("//user/name[@id='2']");