ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Java SAX 解析器 – XML 读取示例 > 原文: [https://howtodoinjava.com/xml/sax-parser-read-xml-example/](https://howtodoinjava.com/xml/sax-parser-read-xml-example/) **SAX 解析器**或 [**XML**](//howtodoinjava.com/category/xml/ "xml tag") 的简单 API 已经存在很多年了,最初由 [David Megginson](http://www.megginson.com/) 领导开发。 那时,您不得不从 David 的个人网站下载 Java 版本的 SAX。 在最终添加到 Java 标准版 1.4 中之前,它已发展为 [**SAX 项目**](http://www.saxproject.org/) 。 SAX 是 XML 的流接口,这意味着使用 SAX 的应用从文档的顶部开始,以顺序的时间接收到有关 XML 文档正在处理元素和属性的事件通知,并以根元素的关闭而结束。 这意味着它在线性时间内处理 XML 的效率非常高,而不会对系统内存提出过多要求。 让我们创建一个演示程序,以便**使用 SAX 解析器**读取 xml 文件以全面理解。 ## 1.准备要解析的 xml 文件 该 xml 文件包含 xml 属性以及 xml 元素。 ```java <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.创建模型类 ```java 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`构建处理器 下面的代码为解析处理器。 我在代码注释中添加了其他信息。 不过,您有任何疑问吗,请给我留言。 ```java 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 文件 ```java 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 解析器 让我们编写一些代码来测试我们的处理器是否真正起作用。 ```java 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] ``` [**下载这篇文章的源码**](https://drive.google.com/file/d/0B7yo2HclmjI4Y1REbUt1aV9lZlk/view?usp=drive_web "下载源码 for sax parser") 学习愉快!