Java SAX 解析器 – XML 读取示例

Java SAX 解析器 – XML 读取示例

原文: https://howtodoinjava.com/xml/sax-parser-read-xml-example/

SAX 解析器XML 的简单 API 已经存在很多年了,最初由 David Megginson 领导开发。 那时,您不得不从 David 的个人网站下载 Java 版本的 SAX。 在最终添加到 Java 标准版 1.4 中之前,它已发展为 SAX 项目

SAX 是 XML 的流接口,这意味着使用 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.howtodoinjava.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.howtodoinjava.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.howtodoinjava.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.howtodoinjava.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]

下载这篇文章的源码

学习愉快!