本文是我在学习《Java核心技术》第九版卷II(高级特性)时写的一段代码。原书作者为(美)Cay S. Horstmann,Gary Cornell,译者为陈昊鹏、王浩、姚建平等。我的Java版本为1.8
Java提供了两种XML解析器:树型解释器DOM(Document Object Model,文档对象模型),和流机制解析器SAX(Simple API for XML,XML简单API)。如果文档较大且处理算法又较为简单,可在运行时解析节点而不必看到完整的树形结构时,DOM处理方式效率不如SAX。
XML文档内容如下:
文件名:NameList.xml,文件路径:C:\Users\Tsybius\Desktop\NameList.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<list1>
<person id="101" name="Tsybius" remark="1" />
<person id="102" name="Galatea" remark="2" />
<person id="103" name="Quintus" remark="3" />
<person id="104" name="Atia" remark="4" />
<person id="105" name="Justitia" remark="5" />
</list1>
<list2>
<person id="201" name="Zhang" remark="a" />
<person id="202" name="Wang" remark="b" />
<person id="203" name="Li" remark="c" />
<person id="204" name="Zhao" remark="d" />
<person id="205" name="Liu" remark="e" />
</list2>
<text>TEXT</text>
</root>
Java代码如下:
package XmlSaxTest;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* 使用SAX解析XML
* @author Tsybius2014
* @date 2015年12月3日
* @time 下午9:46:40
* @remark
*
*/
class XmlSaxTest {
/**
* 使用SAX解析XML
* @param args
*/
public static void main(String[] args) {
String filePath = "C:\\Users\\Tsybius\\Desktop\\NameList.xml";
File f = new File(filePath);
//设置句柄
DefaultHandler handler = new DefaultHandler() {
//XML文档开始读取时触发
public void startDocument() {
System.out.println("---------XML文档解析开始---------");
}
//XML文档读取结束时触发
public void endDocument() {
System.out.println("---------XML文档解析结束---------");
}
//读取到某一元素时触发
public void startElement(String namespaceURI,
String lname, String qname, Attributes attrs) {
System.out.println("节点开始:" + qname);
if (qname.equals("person")) {
System.out.println("id:" + attrs.getValue("id"));
System.out.println("name:" + attrs.getValue("name"));
System.out.println("remark:" + attrs.getValue("remark"));
}
}
//某一元素结束时触发
public void endElement(String url, String lname, String qname) {
System.out.println("节点结束:" + qname);
}
//读取元素值时触发
public void characters(char[] ch, int start, int length) {
String s = new String(ch, start, length);
if (!s.isEmpty() && s.trim().length() > 0) {
System.out.println("值:" + s);
}
}
};
//使用SAX解析XML
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
try {
SAXParser saxParser = factory.newSAXParser();
saxParser.parse(f, handler);
} catch (ParserConfigurationException | SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("END");
}
}
控制台中输出结果如下:
---------XML文档解析开始---------
节点开始:root
节点开始:list1
节点开始:person
id:101
name:Tsybius
remark:1
节点结束:person
节点开始:person
id:102
name:Galatea
remark:2
节点结束:person
节点开始:person
id:103
name:Quintus
remark:3
节点结束:person
节点开始:person
id:104
name:Atia
remark:4
节点结束:person
节点开始:person
id:105
name:Justitia
remark:5
节点结束:person
节点结束:list1
节点开始:list2
节点开始:person
id:201
name:Zhang
remark:a
节点结束:person
节点开始:person
id:202
name:Wang
remark:b
节点结束:person
节点开始:person
id:203
name:Li
remark:c
节点结束:person
节点开始:person
id:204
name:Zhao
remark:d
节点结束:person
节点开始:person
id:205
name:Liu
remark:e
节点结束:person
节点结束:list2
节点开始:text
值:TEXT
节点结束:text
节点结束:root
---------XML文档解析结束---------
END
END