本文是我在学习《Java核心技术》第九版卷II(高级特性)时写的一段代码。原书做者为(美)Cay S. Horstmann,Gary Cornell,译者为陈昊鹏、王浩、姚建平等。个人Java版本为1.8java
Java提供了两种XML解析器:树型解释器DOM(Document Object Model,文档对象模型),和流机制解析器SAX(Simple API for XML,XML简单API)。若是文档较大且处理算法又较为简单,可在运行时解析节点而没必要看到完整的树形结构时,DOM处理方式效率不如SAX。算法
XML文档内容以下:学习
文件名:NameList.xml,文件路径:C:\Users\Tsybius\Desktop\NameList.xmlui
<?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代码以下:url
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"); } }
控制台中输出结果以下:spa
---------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
ENDcode