一、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();
}
}
}