原文: 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 idprivate int id;//XML element fisrtNameprivate String firstName;//XML element lastNameprivate 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;}@Overridepublic 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 stackprivate Stack elementStack = new Stack();//As we complete one user block in XML, we will push the User instance in userListprivate 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 stackthis.elementStack.push(qName);//If this is start of 'user' element then prepare a new User instance and push it in object stackif ("user".equals(qName)){//New User instanceUser user = new User();//Set all required attributes in any XML element here itselfif(attributes != null && 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 elementthis.elementStack.pop();//User instance has been constructed so pop it from object stack and push in userListif ("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 belongsif ("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 objectpublic 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 initiallyArrayList<user> users = new ArrayList</user><user>();try{//Create default handler instanceUserParserHandler handler = new UserParserHandler();//Create parser from factoryXMLReader parser = XMLReaderFactory.createXMLReader();//Register handler with parserparser.setContentHandler(handler);//Create an input source from the XML input streamInputSource source = new InputSource(in);//parse the documentparser.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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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 fileFile xmlFile = new File("D:/temp/sample.xml");//Create the parser instanceUsersXmlParser parser = new UsersXmlParser();//Parse the fileArrayList users = parser.parseXml(new FileInputStream(xmlFile));//Verify the resultSystem.out.println(users);}}Output:[100:Tom:Hanks, 101:Lokesh:Gupta, 102:HowToDo:InJava]
学习愉快!
