主要介紹解析XML的兩種方式
DOM4J解析:
面向?qū)ο笊矶捎谑且淮涡宰x取整個文檔到內(nèi)存中玄括,讀取大文件的時候可能會造成內(nèi)存占用過多鸦泳。
SAX解析:基于事件银锻,一次讀取一部分,操作上比DOM4J繁瑣一點做鹰,不會造成內(nèi)存占用問題击纬。
DOM 解析 | SAX 解析 | |
---|---|---|
原理 | 一次性加載,內(nèi)存占用比較大 | 加載一點钾麸,讀取一點更振,內(nèi)存占用小 |
讀取順序 | 可以任意讀取,可以往回讀 | 只能從上往下依次讀取饭尝,不能往回讀 |
操作方式 | 可查詢肯腕,也可修改 | 只能查詢 |
編碼方式 | 面向?qū)ο?/td> | 基于事件 |
大綱
-
DOM4J 解析
- 導包
- 核心類和方法
- 讀取XML
- 寫出XML
- XPath
-
SAX 解析
jdk集成
- 核心類
- 讀取XML文件加載對象到容器
DEMO
#DOM4J 解析
dom4j是一個Java的XML API,是jdom的升級品钥平,用來讀寫XML文件的实撒。dom4j是一個十分優(yōu)秀的JavaXML API,具有性能優(yōu)異涉瘾、功能強大和極其易使用的特點知态,它的性能超過sun公司官方的dom技術,同時它也是一個開放源代碼的工具立叛。
##導包 下載JAR包
- dom4j-1.6.1.jar
##核心類和方法
SAXReader:負責XML文件的加載
XMLWriter:負責XML文件的輸出
DocumentHelper:用來生成生成 XML 文檔的工廠類
Element:元素節(jié)點
三個重要概念:標簽负敏、屬性、文本
-
標簽
Element
Method | Method Description |
---|---|
getRootElement() | 得到文檔根元素 |
addElement("name") | 添加子標簽 |
element("name") | 尋找指定標簽名的子元素 |
elements("names") | 尋找指定標簽名的子元素(全部) |
elements() | 尋找全部子元素 |
-
屬性
Atrribute
Method | Method Description |
---|---|
atrributeValue("name") | 得到指定屬性的值 |
addAtribute("name", "value") | 添加屬性(以存在則修改) |
atrribute("name") | 得到屬性對象 |
atrributes() | 全部屬性對象列表 |
getName() | 得到屬性名 |
getValue() | 得到屬性值 |
- 文本
Method | Method Description |
---|---|
getText() | 得到文本信息 |
setText() | 修改文本信息 |
elementText("name") | 得到子標簽的文本信息 |
- 其他
DocumentHelper.createDocument():創(chuàng)建新文檔
detach():標簽/屬性自殺
getParent().remove(標簽/屬性):調(diào)用父類的刪除方法來刪除標簽/屬性
##讀取XML
/**
* loading XML File Resource
* @param path XML Resource File Path
* @return XML Document Object
*/
public static Document reader(String path) {
Document document = null;
try {
return new SAXReader().read(XMLTools.class.getClassLoader().getResourceAsStream(path));
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
Document read(File file)
Document read(URL url)
Document read(String systemId)
Document read(InputStream in)
Document read(Reader reader)
##寫出XML
/**
* Writer XML File Resource
* @param document XML Document Object
* @param path XML Resource File Path
* @return result
*/
public static boolean writer(Document document, String path) {
boolean flag = true;
try {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(
new FileWriter(XMLTools.class.getClassLoader().getResource(path).getPath()),
format
);
writer.write(document);
writer.close();
} catch (Exception e) {
flag = false;
e.printStackTrace();
}
return flag;
}
##XPath XPath語法
- 導包:jaxen-1.1-beta-6.jar
// 搜索多個節(jié)點
List<Node> nodes = document.selectNodes(XPath表達式);
// 搜索單個節(jié)點
Node node = document.selectSingleNode(XPath表達式);
#SAX 解析 jdk集成
SAX秘蛇,全稱Simple API for XML其做,既是一種接口,也是一種軟件包赁还。它是一種XML解析的替代方法庶柿。SAX不同于DOM解析,它逐行掃描文檔秽浇,一邊掃描一邊解析浮庐。由于應用程序只是在讀取數(shù)據(jù)時檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲在內(nèi)存中,這對于大型文檔的解析是個巨大優(yōu)勢审残。
##核心類
SAXParser:負責解析XML
DefaultHandler:負責監(jiān)聽加載XML觸發(fā)的事件
- DefaultHandler
自定義一個類繼承DefaultHandler類
- startDocument():文檔開始
- endDocument():文檔結束
- startElement():元素開始
- endElement():元素結束
- characters():文本
當前元素的 text 加載完
##讀取XML配置加載對象到容器
下面是一個讀取XML文件梭域,通過反射技術生成對象并存放到容器的Demo
LoadObjectHandler.java
/**
* 讀取XML文件加載對象到容器
*/
public class LoadObjectHandler extends DefaultHandler {
public static final String BEAN_NODE = "bean";
public static final String BEAN_NAME = "name";
public static final String BEAN_CLASS = "class";
// Object Container
private Map<String, Object> container = new HashMap<>();
/**
* 元素開始
*
* @param uri
* @param localName
* @param qName 標簽名
* @param attributes 屬性列表
* @throws SAXException
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (qName != null && qName.equals(BEAN_NODE)) {
if (attributes != null) {
for (int i = 0; i < attributes.getLength(); i++) {
String name = attributes.getValue(BEAN_NAME);
String clazz = attributes.getValue(BEAN_CLASS);
try {
Class<?> mClass = getClass().forName(clazz);
Object obj = mClass.newInstance();
container.put(name, obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
/**
* 從容器返回對象
*
* @param name Object key
* @return Object
*/
public Object getObject(String name) {
return container.get(name);
}
}
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean name="User" class="tools.xml.test1.User"/>
</beans>
App.java
String path = "../resource/test.xml";
// 從工廠得到解析器
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
// 創(chuàng)建自定義監(jiān)聽器對象
LoadObjectHandler handler = new LoadObjectHandler();
// 解析XML文件
parser.parse(new File(XMLTools.class.getResource(path).getPath()), handler);
System.out.println(handler.getObject("User"));