配置文件都有其特有的书写格式,如properties的配置文件就是等号连接的键值对,xml的配置文件就是一个一个的标签。而读取不同配置文件方法也不一样。但都需要先获取配置文件,而那些直接获取配置文件的方法内部也都是封装了获取配置文件流的方法
目录
2-2、使用抽象类ResourceBundle的getBundle(String baseName)读取
一、获取流 文件
配置文件一般都放在当前类所在的包下,一般java项目配置文件大都都放在src目录下,maven项目的配置文件大都在resource文件夹下。将配置文件放在特殊路径下,可以通过类加载器直接快速的读取配置文件。
通过类加载器获得配置文件,并返回流对象,代码如下:
InputStream ras=JdbcSuperPlus.class.getClassLoader().getResourceAsStream("log4j.properties");
解释:
JdbcSuperPlus.class是当前类的字节码文件对象,也可以是当前包下的任一类的字节码文件对象。
getClassLoader()获取当前类的类加载器,再通过getResourceAsStream方法将配置文件以流的形式读出来。
二、解析properties配置文件
2-1、使用Proerties对象读取
//获取Properties对象
Properties properties = new Properties();
//调用load() 方法读取流文件
properties.load(ras);
//调用getProperty(String key)方法获取配置文件总的值
properties.getProperty("log4j.rootCategory")
2-2、使用抽象类ResourceBundle的getBundle(String baseName)读取
getBundle(String baseName) 不需要加后缀名 内部封装了获取类加载器的方法,baseName直接写配置文件名即可,
代码演示:
//获取对象
ResourceBundle conf = ResourceBundle.getBundle("log4j ");
//读取内容
conf. getString("log4j.rootCategory")
三、解析XML文件
XML是一种可扩展的超文本标记语言,类似于HTML,但标签都是自己定义的,语法严格。因其特殊性,常被用来做配置文件。而现在常用xml解析工具是dom4j和Xpath。
xml文档示例
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student number="xml_001">
<name id="teac_001">
<xing>张</xing>
<ming>三</ming>
</name>
<age>18</age>
<sex>male</sex>
</student>
<student number="xml_002">
<name>jack</name>
<age>18</age>
<sex>female</sex>
</student>
<student number="xml_003">
<name id="teac_001">
<xing>李</xing>
<ming>四</ming>
</name>
<age>20</age>
<sex>male</sex>
</student>
</students>
3-1、xml组成元素
1、文档声明:
<?xml version=”1.0” encoding=”UTF-8”?>
- 文档声明必须以<?xml开头,以?>结束
- 文档声明必须从文档的0行0列位置开始(顶格写)
- 文档声明只有两个属性:
- version xml版本号 都是1.0版本的
- encoding 文档编码,默认UTF-8
2、元素element
-
- 元素是xml文档中最重要的组成部分
- 普通元素的结构:开始标签、元素体、结束标签组成
- 元素体可以是元素,也可以是文本
- 空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合
3、属性 attribute
-
- 属性是元素的一部分,它必须出现在元素的开始标签中
- 属性的定义格式 属性名=属性值,其中属性值必须使用单引号或者双引号引起来
- 一个元素可以有0~n个属性,但是一个元素中不能出现同名属性
4、注释
-
- <!-- 这里写注释-->
- 转义字符
- < <
- > &rt
- “ "
- ‘ &apos
- & &
文本域:
<![CDATA[
文本内容,无论写什么,最后被解析出来的都是文本
]]
3-2、xml文档约束
XML约束用来约束一个XML文档的书写规范,引入约束的xml文档,有其严格的格式要求,即写什么,怎么写,先后顺序,写几个等都会有限制。常见的xml约束:DTD、Schema
约束在此不做详细解释,想了解可自行百度
3-3、xml文档解析
当数据存储在XML后,我们就希望通过程序获得XML的内容。如果我们使用JAVA基础是完全可以完成解析的,但是太繁琐。所以就诞生了xml专用解析器
常用的是dom4j和Xpath
3-3-1 dom4j解析xml文件
dom4j解析原理和结构模型
XML DOM将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作。
dom4j常用API如下:
SaxReader对象
read(String url)加载执行xml文档
Document对象
getRootElement()获取根元素
Element对象
elements(....) 获取指定名称的所有子元素。可以不指定名称
element(...)获取指定名字的第一个元素
getName(...) 获得当前元素的元素名
attributeValue(...)获得指定属性名的属性值
elementText(...)获得指定名字子元素的文本值
getText()获得当前元素的文本内容
代码演示:
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;
import java.util.ResourceBundle;
/**
* @Author: heronsbill
* @DATA: 2019/7/22
*/
public class test02 {
public static void main(String[] args) throws DocumentException {
//获取SAXReader对象
SAXReader saxReader = new SAXReader();
//获取配置文件的流对象
InputStream resourceAsStream = test02.class.getClassLoader().getResourceAsStream("student.xml");
//读取配置文件,并生成Document对象
Document read = saxReader.read(resourceAsStream);
//读取根元素
Element rootElement = read.getRootElement();
System.out.println("根元素:" + rootElement);
//获取根元素下的所有子元素
List<Element> student1 = rootElement.elements("student");
for (Element element : student1) {
//获取name标签
Element name = element.element("name");
//获得当前标签的名字
String name1 = name.getName();
//或的name标签的id属性
String id = name.attributeValue("id");
//获取name标签的xing子标签的文本值
String xing = name.elementText("xing");
//获得当标签包含的文本值
String text = name.getText();
System.out.println("---------------分隔符------------");
System.out.println("获取标签:"+name);
System.out.println("获取当前标签的名字:"+name1);
System.out.println("获得当前标签的id属性:"+id);
System.out.println("获取name标签的xing子标签的文本值:"+xing);
System.out.println("获得当标签包含的文本值:"+text);
}
}
}
打印结果:
根元素:org.dom4j.tree.DefaultElement@536aaa8d [Element: <students attributes: []/>]
---------------分隔符------------
获取标签:org.dom4j.tree.DefaultElement@704a52ec [Element: <name attributes: [org.dom4j.tree.DefaultAttribute@6ee52dcd [Attribute: name id value "teac_001"]]/>]
获取当前标签的名字:name
获得当前标签的id属性:teac_001
获取name标签的xing子标签的文本值:张
获得当标签包含的文本值:
---------------分隔符------------
获取标签:org.dom4j.tree.DefaultElement@4493d195 [Element: <name attributes: []/>]
获取当前标签的名字:name
获得当前标签的id属性:null
获取name标签的xing子标签的文本值:null
获得当标签包含的文本值:jack
---------------分隔符------------
获取标签:org.dom4j.tree.DefaultElement@2781e022 [Element: <name attributes: [org.dom4j.tree.DefaultAttribute@57e1b0c [Attribute: name id value "stu_001"]]/>]
获取当前标签的名字:name
获得当前标签的id属性:stu_001
获取name标签的xing子标签的文本值:李
获得当标签包含的文本值:
3-3-2 Xpath解析xml文件
XPath 是一门在 XML、html 文档中查找信息的语言。
XPath 可以依赖于dom4j来进行解析,即dom4j先获取根标签,然后利用Xpath进行进一步解析
XPath 是一个 W3C 标准,可通过W3CSchool文档查阅语法 由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便,结合XPATH就可以直接 获取到某个元素
dom4j里面提供了两个方法,用来支持Xpath
List<Node> selectNodes("xpath表达式"),用来获取多个节点
Node selectSingleNode("xpath表达式"),用来获取一个节点
xpath表达式常用查询形式
第一种查询形式 /AAA/DDD/BBB: 表示一层一层的,AAA下面 DDD下面的BBB
第二种查询形式 //BBB: 表示和这个名称相同,表示只要名称是BBB 都得到
第三种查询形式 /*: 所有元素
第四种查询形式 BBB[1]:表示第一个BBB元素
BBB[last()]:表示后一个BBB元素
第五种查询形式 //BBB[@id]: 表示只要BBB元素上面有id属性 都得到
第六种查询形式 //BBB[@id='b1'] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1
代码演示:
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.InputStream;
import java.util.List;
/**
* @Author: heronsbill
* @DATA: 2019/7/22
*/
public class test3 {
public static void main(String[] args) throws DocumentException {
//获取SAXReader对象
SAXReader saxReader = new SAXReader();
//获取配置文件的流对象
InputStream resourceAsStream = test02.class.getClassLoader().getResourceAsStream("student.xml");
//读取配置文件,并生成Document对象
Document read = saxReader.read(resourceAsStream);
//获取所有含id属性的name标签中的最后一个
List<Element> list = read.selectNodes("(//name[@id])[last()]");
for (Element element : list) {
//获得name标签下xing标签包含的内容
String xing = element.selectSingleNode("xing").getText();
//获得name标签下ming标签包含的内容
String ming = element.selectSingleNode("ming").getText();
System.out.println("xing:"+xing);
System.out.println("ming:"+ming);
}
}
}
打印结果:
xing:李
ming:四
总结:
开发过程中将一些信息写在配置文件中,通过解析配置文件传递信息,提高代码的复用性。在需要项目产生变动时,可以在不动源码的情况下,通过修改配置文件进行修改。
能力尚浅,有待进步,如有不足,不吝赐教!