XML 是EXtensible Markup Language 的缩写,翻译过来就是可扩展标记语言。即,XML 和 HTML 一样,都是标记语言,也就是说,它们的基本语法都是标签。
特点:
1. 可扩展:即 XML 是允许自定义格式的。但!这并不代表我们就可以随便写。
2. 在 XML 基本语法规范的基础上,我们使用的第三方应用程序、框架等,会通过 XML 约束的方式,强制配置文件中可以写什么,和怎么写~
3. XML 基本语法的定位点:我们并不需要从零开始,一行一行的写 XML 文档,而是,在第三方应用程序、框架的已提供的配置文件的基础上,进行修改即可~(要改成什么样子,取决于我们的具体需求,而怎么改,则取决于 XML 基本语法,和具体的 XML 约束)
目录
常见的配置文件的类型
1. properties:例如 druid 连接池就是使用其作为配置文件的。
语法规范:
1. 由键值对组成
2. 键和值之间的符号的等号
3. 每一行都必须顶格写,前面不能由空格之类的其他符号
示例:
(
补充:由于我们为了文件分类清晰,创建了一个 resources 文件夹,存放 jdbc.properties 文件,但我们的 properties 此时就无法与 src 产生关系。这样就相当于把 properties 文件放进了 src 啦~
)
由于我们编写的代码会有不同的环境,所以也需要不同的配置。比如:1. 在我们程序员自己的电脑。2. 在公司的测试服务器。3. 正式的商用服务器
这样就会显得非常杂乱,层次不清晰
这时候就需要我们的 XML 了
2. XML:例如 Tomcat 就是使用 XML 文件作为配置文件
语法规范:
1. XML 的基本语法和 HTML 的基本语法如出一辙。XML 语法 + HTML 约束 = HTML 语法。在逻辑上,HTML 属于是 XML 的子集。
2. XML 文档声明:这部分基本上就是固定格式:<?xml version="1.0" encoding="UTF-8"?>;
3. 根标签:根标签有且只能有一个
4. 标签关闭:开始标签和结束标签都必须成对出现,单标签在标签内关闭
5. 标签嵌套:标签可以嵌套,但是不能交叉嵌套
6. 属性:属性必须有值,属性值必须加引号,单双都可~
两相对比,XML 更有层次,清晰一些~
xml 也是有约束的:约束用于限定 XML 内部能编写的内容,在编写 XML 的时候,编辑工具会根据约束来进行提示。XML 约束主要包括 DTD(简单,上手快,约束没有 Schema 细致) 和 Schema(复杂,上手慢,约束要比 DTD 更加细致) 两种。
但 XML 约束并不需要我们自己写,可以 idea 直接生成~
这就是 idea 自动为我们生成的 xml 限制,看倒数第二行的一长串的地址末尾,为 .xsd 就表明的 Schema 限制~ 如果是 .dtd 就是 DTD 限制
加了限制之后,我们就无法再随意填写标签了~
3. YAML/YML:例如 SpingBoot 就是使用 YAML 作为配置文件
4. JSON:通常用来做文件传输,也可以用来做前端或者移动端的配置文件
DOM4J 进行 XML 解析
1. 导入 jar 包 dom4.jar
2. 创建解析对象(SAXReader)
3. 解析 XML 获得 Document 对象
4. 获取根节点 RootElement
5. 获取根节点下的字节点
我们首先要导入 jar 包(下载 jar 包的流程我在前面文章有提到:jar 包如何下载-CSDN博客)
然后,我们就可以在 src 中创建类,来secessionist DOM4J 对 XML 进行解析~
package test;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.testng.annotations.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;
@Test
public class TestDOM4j_demo {
public void testRead() throws FileNotFoundException, DocumentException {
// 读取 jdbc.xml 配置文件,获得 document 对象
SAXReader saxReader = new SAXReader();
// 1. 直接获得 document 对象
// 这种方法需要确定 xml 文件的路径,可以用第二种反射的方法
//saxReader.read(new FileInputStream("E:\\java_new\\java_code\\xml-demo\\resources\\jdbc.xml"));
// 2. 通过类加载器来获得指向字节码根路径下的指定文件的输入流
InputStream resourceAsStream = TestDOM4j_demo.class.getClassLoader().getResourceAsStream("jdbc.xml");
// 其实真正实际操作的时候,很少我们直接读取 xml 文件,框架种都会自带~
// 通过输入流获得配置文件,解析成一个 dom 对象
Document document = saxReader.read(resourceAsStream);
// 从 document 对象上获取配置文件种的信息
/*
document 树:
Node 节点
Element 元素节点
Attribute 属性节点
Test 文本节点
*/
Element rootElement = document.getRootElement();
System.out.println(rootElement.getName());
// 获取元素下的子元素
List<Element> elements = rootElement.elements();
for (Element element : elements) {
System.out.println("\t" + element.getName());
// 从元素上获取属性
Attribute idAttribute = element.attribute("id");
System.out.println("\t\t" + idAttribute.getName() + "=" + idAttribute.getValue());
// 继续读取子元素
List<Element> eles = element.elements();
for (Element ele : eles) {
System.out.println("\t\t" + ele.getName() + ":" + ele.getText());
}
}
}
}