一、SAX解析
SAX解析xml的方式是一種快速解析xml文檔的手段,優點是效率高,適用於解析量不大的xml文檔。
使用案例: 使用sax的方式將如下的xml文檔的用戶信息解析出來。
1)引入dom4j依賴
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
2) 新建一個xml文檔,一個user標籤標示一個人物對象
<web>
<user>
<username>張三</username>
<password>abc</password>
<age>23</age>
</user>
</web>
3) 此處有2種方式來獲取resource目錄下的文檔:
第一種方式:通過絕對路徑的方式獲取
String path=test.class.getClassLoader().getResource("user.xml").getPath();
System.out.println("絕對路徑path:"+path);
//path:/F:/eclipseWorkspace/saxreader-test/target/classes/user.xml
第二種方式: 直接使用相對路徑的方式
路徑爲: src\\main\\resources\\user.xml
package com.hbust.demo;
import java.io.File;
import java.net.URL;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.xml.sax.SAXException;
/**
*author:bingbing
*日期:2020年2月24日
*時間:上午9:56:01
*/
public class test {
/**
* 使用sax方式解析xml
*/
public static void main(String []args) {
SAXReader reader=new SAXReader();
//載入文件,獲取絕對路徑
String path=test.class.getClassLoader().getResource("user.xml").getPath();
System.out.println("絕對路徑path:"+path);
//path:/F:/eclipseWorkspace/saxreader-test/target/classes/user.xml
//相對路徑是src\\main\\resources\\user.xml
Document doc = null;
try {
doc = reader.read(new File("src\\main\\resources\\user.xml"));
} catch (DocumentException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//獲取根節點對象
Element root=doc.getRootElement();
System.out.println("root:"+root.getName());
//獲取用戶名、密碼、和年齡信息
List<Element> elements=root.elements("user");
for(Element e: elements) {
String username=e.elementText("username");
String password=e.elementText("password");
String age=e.elementText("age");
System.out.println("username:"+username+"password:"+password+"age:"+age);
}
System.out.println(root);
}
}
二、DOM解析
Document適用於解析文件比較大的xml, 優點是對於大量數據下可以快速解析訪問,缺點初次加載需要將文檔的所有標籤以節點的形式全部加載到內存裏,比較耗時。
使用案例: 使用DOM的方式將如下的xml文檔的用戶信息解析出來。
1)DOM解析的方式不需要引入外部依賴,jdk內置有
2) 此處需要將獲取到的node轉換爲element,每一個標籤都可以getElementsByTagName方法獲取爲節點,然後再取得節點的信息。
package com.hbust.demo;
import java.io.IOException;
import java.util.Arrays;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
*author:bingbing
*日期:2020年2月24日
*時間:上午11:06:33
*/
public class test {
//使用docoument方式解析xml文檔
public static void main(String[]args) {
DocumentBuilderFactory documentBuilderFactory
= DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = null;
try {
documentBuilder = documentBuilderFactory.newDocumentBuilder();
} catch (ParserConfigurationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
Document document = documentBuilder.parse(
test.class.getClassLoader().getResourceAsStream("user.xml"));
NodeList lists=document.getElementsByTagName("user");
for(int i=0;i<lists.getLength();i++) {
Node node=lists.item(i);
Element ele=(Element)node;
String username=ele.getElementsByTagName("username").item(0).getTextContent();
System.out.println("username:"+username);
}
System.out.println();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}