Java学习:使用SAX解析XML

本文介绍使用SAX解析XML的方法,并提供了一个具体的Java代码示例。通过该示例可以了解如何利用SAX解析器读取XML文件中的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://my.oschina.net/Tsybius2014/blog/539109

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值