前言
? ? ? ? 最近考試周忙得要死,但我卻不緊不慢,還有三天復習時間,考試科目幾乎都還沒學呢。今天更新一個算是工具類-XML文件的解析,感覺還是挺有用的,之后可以融進自己的項目里。
XML 配置文件解析
0、導入依賴
有點像我之前爬蟲學的 Jsoup 一樣,只不過 Jsoup 可以用來解析 HTML,這個是解析 XML。
<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.1</version></dependency>
1、配置文件的兩種讀取方式
1.1、從同級目錄讀取
語法:
類名.class.getResourceAsStream("配置文件名")
案例:
編寫一個數據庫配置文件,放到和讀取類同級的目錄下:
username=root
password=123456
url=jdbc:mysql://localhost:3306/test
driver_Class5=com.mysql.jdbc.Driver
driver_Class8=com.mysql.cj.jdbc.Driver
讀取:?
public static void readCurrentDir(String propertyName) throws IOException {// todo 加載同級目錄下的配置文件// 1. 加載配置文件,返回輸入流 (底層是通過類加載器)InputStream in = XMLParser.class.getResourceAsStream("db.properties");// 2. 實例化 Properties 工具類Properties p = new Properties();// 3. 調用 load 方法加載輸入流p.load(in);// 通過 getProperty 方法輸出配置文件中指定key的內容System.out.println("username: "+p.getProperty("username"));System.out.println("password: "+p.getProperty("password"));}
2、從根目錄下(resources)讀取
繼續把上面的配置文件放到 resources 目錄下:
public static void readFromResources() throws IOException {// todo 加載同級目錄下的配置文件// 1. 加載配置文件,返回輸入流 (底層是通過類加載器)InputStream in = XMLParser.class.getResourceAsStream("/db.properties");// 2. 實例化 Properties 工具類Properties p = new Properties();// 3. 調用 load 方法加載輸入流p.load(in);// 通過 getProperty 方法輸出配置文件中指定key的內容System.out.println("username: "+p.getProperty("username"));System.out.println("password: "+p.getProperty("password"));}
DOM4J是 dom4j.org 出品的一個開源 XML 解析包。DOM4J應用于 Java 平臺,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。
2、XML 文件的解析
有了上面的鋪墊,我們就可以把不同位置的 XML 文件都讀取進來了,接下來介紹常用的簡單解析方法。
Dom4j?解析過程
- 創建SAXReader對象。
- 調用SAXReader對象的 read() 方法,將XML文件讀入內存,并返回一個Document對象。
- 通過Document對象的 getRootElement() 方法獲取XML文件中的根節點(是一個 Element 對象)。
- 通過根節點的靜態方法 elements() 獲得一個子節點集合。
- 遍歷根節點的所有子節點,獲取需要的元素節點及其屬性和文本內容。
打印 xml 文件內容的語法:
InputStream in = XMLParser.class.getResourceAsStream("/books.xml");SAXReader reader = new SAXReader();Document doc = reader.read(in);System.out.println(doc.asXML());
下面案例用到的 XML 文件。
<bookstore><book category="love"><title lang="en">黃金時代</title><author>王小波</author><year>1991</year><price>30.00</price></book>
</bookstore>
2.1、獲取標簽內容
public static void dom4j_forEach() throws DocumentException {InputStream in = XMLParser.class.getResourceAsStream("/books.xml");SAXReader reader = new SAXReader();Document doc = reader.read(in);Element root = doc.getRootElement();List<Element> books = root.elements();for (Element book : books) {System.out.println("category: "+book.elementText("category"));System.out.println("title: "+book.elementText("title"));System.out.println("author: "+book.elementText("author"));}}
2.2、添加一個子標簽
public static void dom4j_addSubNode() throws DocumentException {InputStream in = XMLParser.class.getResourceAsStream("/books.xml");SAXReader reader = new SAXReader();Document doc = reader.read(in);Element root = doc.getRootElement();List<Element> books = root.elements();for (Element book : books) {Element publish = book.addElement("publish");publish.addAttribute("name","publishTime");publish.setText("2003");}System.out.println(doc.asXML());}
后面用到的時候有什么新用法在來更新吧。