配置文件都有其特有的書寫格式,如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:四
總結:
開發過程中將一些信息寫在配置文件中,通過解析配置文件傳遞信息,提高代碼的複用性。在需要項目產生變動時,可以在不動源碼的情況下,通過修改配置文件進行修改。
能力尚淺,有待進步,如有不足,不吝賜教!