Java SAX解析器 之 阅读XML示例

SAX解析器(即XML的简单API)已经存在了很多年,最初是在世纪之交之前由David Megginson领导的开发。在那些日子里,您必须从David的个人网站下载Java版本的SAX。在最终添加到Java Standard Edition 1.4中之前,它已发展为SAX项目

SAX是XML的 Stream 接口,这意味着使用SAX的应用程序从文档的顶部开始,以顺序的时间接收到有关正在处理的XML文档的事件通知的元素和属性,并以关闭文档的结尾结束。根元素。这意味着它在线性时间内处理XML的效率非常高,而对系统内存没有太多要求。

让我们创建一个演示程序,以使用SAX解析器读取xml文件以充分理解。

1.准备要解析的xml文件

该xml文件包含xml属性以及xml元素。

<users>
    <user id="100">
        <firstname>Tom</firstname>
        <lastname>Hanks</lastname>
    </user>
    <user id="101">
        <firstname>Lokesh</firstname>
        <lastname>Gupta</lastname>
    </user>
    <user id="102">
        <firstname>HowToDo</firstname>
        <lastname>InJava</lastname>
    </user>
</users>

2.创建模型类

package com.how2codex.xml.sax;
/**
 * Model class. Its instances will be populated using SAX parser.
 * */
public class User
{
    //XML attribute id
    private int id;
    //XML element fisrtName
    private String firstName;
    //XML element lastName
    private String lastName;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    @Override
    public String toString() {
        return this.id + ":" + this.firstName +  ":" +this.lastName ;
    }
}

3.通过扩展DefaultParser构建处理程序

下面的代码为解析处理程序。我在代码注解中添加了其他信息。不过,您有任何疑问吗,请给我留言。

package com.how2codex.xml.sax;
import java.util.ArrayList;
import java.util.Stack;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class UserParserHandler extends DefaultHandler
{
    //This is the list which shall be populated while parsing the XML.
    private ArrayList userList = new ArrayList();
    //As we read any XML element we will push that in this stack
    private Stack elementStack = new Stack();
    //As we complete one user block in XML, we will push the User instance in userList
    private Stack objectStack = new Stack();
    public void startDocument() throws SAXException
    {
        //System.out.println("start of the document   : ");
    }
    public void endDocument() throws SAXException
    {
        //System.out.println("end of the document document     : ");
    }
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
    {
        //Push it in element stack
        this.elementStack.push(qName);
        //If this is start of 'user' element then prepare a new User instance and push it in object stack
        if ("user".equals(qName))
        {
            //New User instance
            User user = new User();
            //Set all required attributes in any XML element here itself
            if(attributes != null &amp;&amp; attributes.getLength() == 1)
            {
                user.setId(Integer.parseInt(attributes.getValue(0)));
            }
            this.objectStack.push(user);
        }
    }
    public void endElement(String uri, String localName, String qName) throws SAXException
    {
        //Remove last added  element
        this.elementStack.pop();
        //User instance has been constructed so pop it from object stack and push in userList
        if ("user".equals(qName))
        {
            User object = this.objectStack.pop();
            this.userList.add(object);
        }
    }
    /**
     * This will be called everytime parser encounter a value node
     * */
    public void characters(char[] ch, int start, int length) throws SAXException
    {
        String value = new String(ch, start, length).trim();
        if (value.length() == 0)
        {
            return; // ignore white space
        }
        //handle the value based on to which element it belongs
        if ("firstName".equals(currentElement()))
        {
            User user = (User) this.objectStack.peek();
            user.setFirstName(value);
        }
        else if ("lastName".equals(currentElement()))
        {
            User user = (User) this.objectStack.peek();
            user.setLastName(value);
        }
    }
    /**
     * Utility method for getting the current element in processing
     * */
    private String currentElement()
    {
        return this.elementStack.peek();
    }
    //Accessor for userList object
    public ArrayList getUsers()
    {
        return userList;
    }
}

4. SAX解析器读取XML文件

package com.how2codex.xml.sax;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class UsersXmlParser
{
    public ArrayList parseXml(InputStream in)
    {
        //Create a empty link of users initially
        ArrayList<user> users = new ArrayList</user><user>();
        try
        {
            //Create default handler instance
            UserParserHandler handler = new UserParserHandler();
            //Create parser from factory
            XMLReader parser = XMLReaderFactory.createXMLReader();
            //Register handler with parser
            parser.setContentHandler(handler);
            //Create an input source from the XML input stream
            InputSource source = new InputSource(in);
            //parse the document
            parser.parse(source);
            //populate the parsed users list in above created empty list; You can return from here also.
            users = handler.getUsers();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
        }
        return users;
    }
}

5)测试SAX解析器

让我们编写一些代码来测试我们的处理程序是否真正起作用。

package com.how2codex.xml.sax;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
public class TestSaxParser
{
    public static void main(String[] args) throws FileNotFoundException
    {
        //Locate the file
        File xmlFile = new File("D:/temp/sample.xml");
        //Create the parser instance
        UsersXmlParser parser = new UsersXmlParser();
        //Parse the file
        ArrayList users = parser.parseXml(new FileInputStream(xmlFile));
        //Verify the result
        System.out.println(users);
    }
}
Output:
[100:Tom:Hanks, 101:Lokesh:Gupta, 102:HowToDo:InJava]

学习愉快!

This entry was posted in   Xml.
Bookmark the   permalink.

saigon has written 1440 articles

Leave a Reply