我們通過一個小案例來看xml解析過程。
1. 導包
<dependencies> <!-- xml解析工具 --> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <!-- 常用工具包 --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> </dependencies>
2. xml文件
<?xml version="1.0" encoding="UTF-8"?> <users> <user1 id="001"> <id>01</id> <name>周傑倫</name> <age>23</age> <job>歌手</job> </user1> <user2 id="002"> <id>02</id> <name>胡歌</name> <age>24</age> <job>演員</job> </user2> </users>
3. 測試代碼
import java.io.InputStream; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.StringUtils; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.xml.sax.SAXException; /** * spring讀取xml配置的過程 */ public class Test { public static void main(String[] args) throws SAXException, DocumentException { Test t = new Test(); SAXReader saxReader = new SAXReader(); // 讀取文件 Document read = saxReader.read(t.getClassPath("user.xml")); // 獲取根節點 Element rootElement = read.getRootElement(); t.getNodes(rootElement); } // 1. 通過文件名獲取輸入流 public InputStream getClassPath(String xmlPath) { InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(xmlPath); return resourceAsStream; } // 2. 獲取節點信息 public static void getNodes(Element rootElement) { System.out.println("獲取當前名稱:" + rootElement.getName()); // 獲取屬性信息 List<Attribute> attributes = rootElement.attributes(); for (Attribute attribute : attributes) { System.out.println("屬性:" + attribute.getName() + " : " + attribute.getText()); } // 獲取屬性value String value = rootElement.getTextTrim(); if (!StringUtils.isEmpty(value)) { System.out.println("value:" + value); } // 使用迭代器遍歷,繼續遍歷子節點 Iterator<Element> elementIterator = rootElement.elementIterator(); while (elementIterator.hasNext()) { Element next = elementIterator.next(); getNodes(next); } } } ====================== 【控制台輸出】 獲取當前名稱:users 獲取當前名稱:user1 屬性:id : 001 獲取當前名稱:id value:01 獲取當前名稱:name value:周傑倫 獲取當前名稱:age value:23 獲取當前名稱:job value:歌手 獲取當前名稱:user2 屬性:id : 002 獲取當前名稱:id value:02 獲取當前名稱:name value:胡歌 獲取當前名稱:age value:24 獲取當前名稱:job value:演員
spring解析xml配置文件過程:
Dom4j與Sax區別
dom4j不適合大文件的解析,因為它是一下子將文件加載到內存中,所以有可能出現內存溢出,sax是基於事件來對xml進行解析的,所以他可以解析大文件的xml,也正是因為如此,所以dom4j可以對xml進行靈活的增刪改查和導航,而sax沒有這么強的靈活性,所以sax經常是用來解析大型xml文件,而要對xml文件進行一些靈活(crud)操作就用dom4j。