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

相關文章
相關標籤/搜索