XML学习笔记
Posted 二木成林
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML学习笔记相关的知识,希望对你有一定的参考价值。
目录
1. XML概念
xml:是一种可扩展标记语言。
1.1 可扩展
指xml的标签都是自定义的。如<student>、<name>等。
1.2 功能
xml文件现在是用来存储数据的,以前是用来展示数据的。
应用:
- 用作配置文件,例如SSM框架的配置文件就是xml。
- 在网络种传输,例如前后端交互传数据就可以使用xml格式(不过现在使用较多的是json格式)。
1.3 xml与html的区别
之所以拿来比较,是因为二者都具有类似的标签,都是DOM树状结构。
主要区别:
- 1. xml标签都是自定义的(即程序员自定义的,如<student>、<name>等),html标签是预定义(即w3c联盟规定的标签,如<html>、<input>等)。
- 2. xml的语法严格(即必须要有结束标记,如<name></name>),html语法松散(即可以省略</p>或</li>这样的结束标记)。
- 3. xml是存储数据的,html是展示数据。
其他区别:
- 1. xml严格区分大小写,html不区分大小写。
- 2. xml种属性值必须放在双引号或单引号种,html可用可不用的。
- 3. xml种所有属性必须有相应的属性值,html可以拥有不带值的属性名。
- 4. xml中空白部分不会被解析器自动删除,html会过滤掉空格。
1.4 xml与properties的区别
之所以拿来比较,是因为二者都可以存储数据,都可以作为配置文件使用。
主要区别:
- xml配置文件是树状结构,可以配置各种情况,而properties文件是每一行就是一个键值对(key = value)。
- xml结构更加清晰也更为复杂,而properties文件结构简单。
- xml文件更加灵活,可以配置各种情况,而properties文件以键值对形式存在,主要是赋值操作。
- xml文件配置繁琐,使用也需要专门的解析器才能获取到有效的信息,而properties使用更加便捷,直接通过getProperty(key)或setProperty(key, value)即可使用。
- xml适用于需求复杂,比较大型的项目,而properties文件适用于小型比较简单的项目。
二者的应用举例:如配置JDBC连接数据库的信息就可以使用properties文件,而SSM框架的配置文件使用的就是xml文件。
2. 语法
2.1 基本语法
基本语法如下:
- 1. xml文档的后缀名 .xml
- 2. xml第一行必须定义为文档声明<?xml version='1.0' ?>必须在第一行
- 3. xml文档中有且仅有一个根标签
- 4. 属性值必须使用引号(单双都可)引起来,如<user id="1"></user>
- 5. 标签必须正确关闭,即必须有结束标记,如<user></user>而不能是<user>
- 6. xml标签名称区分大小写,html标签不区分大小写
2.2 快速入门
<?xml version="1.0" encoding="UTF-8" ?>
<users>
<user id="1">
<name>张三</name>
<age>12</age>
<sex>f</sex>
</user>
<user id="2">
<name>李四</name>
<age>122</age>
<sex>m</sex>
</user>
</users>
如:
可以用浏览器来查看该xml结构
2.3 组成部分
2.3.1 文档声明
格式:
<?xml 属性列表 ?>
例如:
<?xml version="1.0" encoding="UTF-8" ?>
<!--尖括号与问号之间不能有空格-->
其中的属性列表有如下几个:
- version:版本号,必须的属性,否则会报错
- encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1,可以设置encoding='gbk'或encoding='utf-8'才能解析中文,高级的开发工具会自动识别如IDEA。
- standalone:是否独立,即是否依赖其他文件,该属性了解即可。取值如下:
- yes:不依赖其他文件
- no:依赖其他文件
2.3.2 指令
该概念了解即可。
结合css的,因为早期是用来展示数据的,现在几乎不使用了,因为有html专门用来展示。
如下所示,给user.xml引入一行
<?xml-stylesheet type="text/css" href="user.css" ?>
其中user.css为如下:
打开浏览器查看该user.xml会发现字体有了不同的颜色
2.3.3 标签
标签就是<user></user>这种的,其中的名称程序员自定义的。
但名称还是有些规则的:
- 名称可以包含字母、数字以及其他的字符。
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
2.3.4 属性
如<user id="1"></user>这样的,其中id是属性,id属性值唯一。
并且属性值必须用单引号或双引号引起来。
2.3.5 文本
如<sex>f</sex>中的"f"就是文本,即标签中包括的文本,可以是中文、英文、数字等。
但如果要显示特殊的字符,如一段代码,可能就不会成功
当然可以使用html特殊字符来处理
但可能难以记忆和阅读,所以xml提供了一种语法来处理这种特殊字符的情况,即:
CDATA区:在该区域中的数据会被原样展示(因为特殊字符如'<'需要转义才能展示)
格式如下:
<![CDATA[ 数据 ]]>
例如:
2.3.6 约束
1. 约束是什么?
- 约束:规定xml文档的书写规则(作用,比如说颜色必须写<color>标签)
2. 为什么要写约束?
- xml文件是需要被软件解析的,但xml文件是程序员编写的,在软件解析xml文件的时候并不知道xml里面有些什么标签,有些什么属性,所以需要一种约束来规定它们(例如我们在xml中设置了颜色用<color></color>,但解析器不知道,就不能解析了,所以需要一个桥梁来沟通解析器与xml,让它们之间达成一种共识)。
3. 作为框架(如SSM框架)的使用者(程序员)的要求?
- 1. 能够在xml中引入约束文档
- 2. 能够简单的读懂约束文档
4. 常见约束有哪几种分类呢?
- DTD: 一种简单的约束技术
- Schema: 一种复杂的约束技术
5. DTD介绍
这里只简单介绍DTD该如何引入,具体的书写规则请参考:DTD教程
- 引入dtd文档到xml文档中
- 内部dtd:将约束规则定义在xml文档中,不通用,了解即可
- 外部dtd:将约束的规则定义在外部的dtd文件中,常用
- 本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
- 网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
内部dtd的例子:
外部dtd-本地的例子:
6. Schema
这里只简单介绍Schema该如何引入,具体的书写规则请参考:Schema教程
- Schema引入
- 1.填写xml文档的根元素
- 2.引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- 3.引入xsd文件命名空间. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
- 4.为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.itcast.cn/xml"
例如spring-mvc的引入配置:
3. 解析xml
解析xml:即是操作xml文档,将文档中的数据读取到内存中。
3.1 操作xml文档
操作xml文档有两种情况:读取和写入。
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档中。持久化的存储,即保存到数据库等。
3.2 解析xml的方式
解析xml有两种思想:
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树。一般web端使用。
- 优点:操作方便,可以对文档进行CRUD(即增删改查)的所有操作
- 缺点:DOM树由于一次性加载,所以可能占内存
- SAX:逐行读取,基于事件驱动的。一般移动端使用。
- 优点:不占内存。
- 缺点:只能读取,不能增删改
3.3 xml常见的解析器
能够解析xml的解析器,常见的有以下几种:
- JAXP:sun公司提供的解析器,支持dom和sax两种思想,性能较差,使用较少
- DOM4J:一款非常优秀的解析器
- Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
- PULL:android操作系统内置的解析器,sax方式的。
3.4 Jsoup
这里主要说明jsoup的使用。
3.4.1 Jsoup概述
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
Jsoup还可以用作爬虫,其简单操作请参考:Jsoup入门教程
3.4.2 Jsoup快速入门
步骤如下:
- 1. 导入jar包(或使用maven坐标)
- 2. 获取Document对象
- 3. 获取对应的标签Element对象
- 4. 获取数据
代码如下:
user.xml
<?xml version="1.0" encoding="UTF-8" ?>
<users>
<user id="1">
<name>张三</name>
<age>12</age>
<sex>f</sex>
</user>
<user id="2">
<name>李四</name>
<age>122</age>
<sex>m</sex>
</user>
</users>
JsoupDemo1.java
public class JsoupDemo1 {
public static void main(String[] args) throws IOException {
// 1.获取user.xml路径
String path = JsoupDemo1.class.getClassLoader().getResource("user.xml").getPath();
// 2.解析xml文档,加载文档进内存,获取dom树--->Document
Document document = Jsoup.parse(new File(path), "utf-8");
// 3.获取元素对象Element
Elements elements = document.getElementsByTag("users");
// 4.打印结果
System.out.println(elements);
}
}
就会打印整个user.xml文档内容在控制台。
3.4.3 Jsoup对象的使用
1. 查看官方文档文档
可以查看文档
接着用浏览器打开index.html
就可以看到官方文档了
2. Document对象
即文档对象。代表内存中的dom树。
其中该对象最重要的是获取Element对象。
常用的方法有:
- getElementById(String id):根据id属性值获取唯一的element对象
- getElementsByTag(String tagName):根据标签名称获取元素对象集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
- ......
代码实例:
public class JsoupDemo2 {
public static void main(String[] args) throws IOException {
// 1.获取user.xml路径
String path = JsoupDemo2.class.getClassLoader().getResource("user.xml").getPath();
// 2.解析xml文档,加载文档进内存,获取dom树--->Document
Document document = Jsoup.parse(new File(path), "utf-8");
// 2.1根据id属性值获取唯一的element对象
Element elementById = document.getElementById("2");
System.out.println(elementById);
System.out.println("------------------------------------------");
// 2.2 根据标签名称获取元素对象集合
Elements elementsByTag = document.getElementsByTag("age");
System.out.println(elementsByTag);
System.out.println("------------------------------------------");
// 2.3 根据属性名称获取元素对象集合
Elements elementsByAttribute = document.getElementsByAttribute("id");
System.out.println(elementsByAttribute);
System.out.println("------------------------------------------");
// 2.4 根据对应的属性名和属性值获取元素对象集合
Elements elementsByAttributeValue = document.getElementsByAttributeValue("id", "1");
System.out.println(elementsByAttributeValue);
}
}
3. Elements对象
元素Element对象的集合。可以当做 ArrayList<Element>来使用。
4. 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():获取标签体的所有内容(包括字标签的字符串内容)
代码实例:
public class JsoupDemo3 {
public static void main(String[] args) throws IOException {
// 1.获取user.xml路径
String path = JsoupDemo3.class.getClassLoader().getResource("user.xml").getPath();
// 2.解析xml文档,加载文档进内存,获取dom树--->Document
Document document = Jsoup.parse(new File(path), "utf-8");
// 3. 通过id属性值获取唯一的元素对象
Element element = document.getElementById("1");
// 3.1 获取属性值
String id = element.attr("id");
System.out.println(id);
System.out.println("------------------------------------------");
// 3.2 获取文本内容
String text = element.text();
System.out.println(text);
System.out.println("------------------------------------------");
// 3.3 获取包括html标签在内的所有内容
String html = element.html();
System.out.println(html);
}
}
/**
* 打印结果:
* 1
* ------------------------------------------
* 张三 12 f
* ------------------------------------------
* <name>
* 张三
* </name>
* <age>
* 12
* </age>
* <sex>
* f
* </sex>
*/
5. Node对象
是Document和Element的父类。
3.4.4 快捷查询方式
上面要查某个标签的信息,要写比较多的代码,操作繁琐,所以产生了下面的快捷查询方式:CSS选择器和Xpath查询。
1. CSS选择器
语法格式:
Elements.select(String cssQuery)
// Elements是查询出来的Elements对象
// cssQuery是参数,指CSS选择器
使用方法(查阅文档):
(注:文档位置在:...\\jsoup-1.11.2-javadoc\\org\\jsoup\\select\\Selector.html)
代码实例:
public class JsoupDemo4 {
public static void main(String[] args) throws IOException {
// 1.获取user.xml路径
String path = JsoupDemo3.class.getClassLoader().getResource("user.xml").getPath();
// 2.解析xml文档,加载文档进内存,获取dom树--->Document
Document document = Jsoup.parse(new File(path), "utf-8");
// 3.获取Elements对象
Elements users = document.getElementsByTag("users");
// 3.1 根据id来获取
Elements elements_id = users.select("#1");
System.out.println(elements_id);
System.out.println("------------------------------------------");
// 3.2 根据属性名来获取
Elements elements_attr = users.select("[id]");
System.out.println(elements_attr);
System.out.println("------------------------------------------");
// 3.3 根据属性值来匹配
Elements elements_attr_val = users.select("[id='2']");
System.out.println(elements_attr_val);
System.out.println("------------------------------------------");
// 3.4 获取子元素
Elements elements_child = users.select("user > name");
System.out.println(elements_child);
}
}
2. Xpath
XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。
使用Jsoup的Xpath需要额外导入jar包。
关于xpath语法请参考:XPath教程
代码实例:
public class JsoupDemo5 {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
// 1.获取user.xml路径
String path = JsoupDemo3.class.getClassLoader().getResource("user.xml").getPath();
// 2.解析xml文档,加载文档进内存,获取dom树--->Document
Document document = Jsoup.parse(new File(path), "utf-8");
// 3.根据document对象,创建JXDocument对象
JXDocument jxDocument=new JXDocument(document);
// 4.结合xpath语法查询
// 4.1 查询所有user标签
List<JXNode> jxNodes1 = jxDocument.selN("//user");
for (JXNode jxNode : jxNodes1) {
System.out.println(jxNode.getElement());
}
System.out.println("------------------------------------------");
// 4.2 查询所有user标签下的name标签
List<JXNode> jxNodes2 = jxDocument.selN("//user/name");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode.getElement());
}
System.out.println("------------------------------------------");
// 4.3 查询users标签下带有id属性的user标签
List<JXNode> jxNodes3 = jxDocument.selN("//users/user[@id]");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode.getElement());
}
System.out.println("------------------------------------------");
// 4.4 询users标签下带有id属性的user标签,并且id属性值为"1"
List<JXNode> jxNodes4 = jxDocument.selN("//users/user[@id='2']");
for (JXNode jxNode : jxNodes4) {
System.out.println(jxNode.getElement());
}
}
}
4. 扩展
4.1 XML实例应用
下面以加载数据库连接信息为例,来演示下简单使用。
4.1.1 通过properties配置数据库连接信息
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
GetConnectionByProp.java
public class GetConnectionByProp {
public static void main(String[] args) throws IOException {
// 1.获取properties文件路径
String path = GetConnectionByProp.class.getClassLoader().getResource("extend/properties/jdbc.properties").getPath();
// 2.实例化Properties对象并加载配置文件
Properties properties = new Properties();
properties.load(new FileInputStream(new File(path)));
// 3.提取参数
String driver = properties.getProperty("jdbc.driver");
String url = properties.getProperty("jdbc.url");
String username = properties.getProperty("jdbc.username");
String password = properties.getProperty("jdbc.password");
// 4.打印结果(同样,这里不连接数据库)
System.out.println(driver + "\\n" + url + "\\n" + username + "\\n" + password);
}
}
/**
* 打印结果:
* com.mysql.jdbc.Driver
* jdbc:mysql://localhost:3306/test
* root
* root
*/
4.1.2 通过xml配置数据库连接信息
database.xml
<?xml version="1.0" encoding="UTF-8" ?>
<jdbc>
<driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://localhost:3306/test</url>
<username>root</username>
<password>root</password>
</jdbc>
GetConnectionByXml.java
public class GetConnectionByXml {
public static void main(String[] args) throws IOException {
// 1.获取database.xml的路径
String path = GetConnectionByXml.class.getClassLoader().getResource("extend/xml/database.xml").getPath();
// 2.加载xml文件得到Document对象
Document document = Jsoup.parse(new File(path), "utf-8");
// 3.获取Elements元素对象
Elements jdbc = document.getElementsByTag("jdbc");
// 4.获取参数
String driver = jdbc.select("driver").text();
String url = jdbc.select("url").text();
String username = jdbc.select("username").text();
String password = jdbc.select("password").text();
// 5.打印结果(这里就不连接数据库了)
System.out.println(driver + "\\n" + url + "\\n" + username + "\\n" + password);
}
}
/**
* 打印结果:
* com.mysql.jdbc.Driver
* jdbc:mysql://localhost:3306/test
* root
* root
*/
这只是简单应用,一般情况下,我们都是使用别人的框架(如SSM)直接在xml中配置,而不是写这种松散的xml文件。
4.2 知识扩展
本节说明的是xml的使用,但在本节中应用到了很多相关的知识。
其学习教程地址如下:
4.3 本节源码
本节源码地址:Xml的使用
以上是关于XML学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
XXE外部实体注入(XML External Entity Injection)学习笔记
在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途