我们通过一个小案例来看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。