Java学习:使用SAX解析XML

本文是我在学习《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

相关文章
相关标签/搜索