在上一篇文章中,我们已经讨论了Java中的reading XML file using DOM parser。现在在这篇文章中,我们将学习如何使用SAX分析器在Java中读取XML文件。
SAX解析器的工作方式与DOM解析器不同,它既不加载任何XML文档到内存中,也不创建XML文档的对象表示。相反,SAX解析器使用回调函数(org.xml.sax.helpers.DefaultHandler
)来通知客户XML文档的结构.
SAX Parser is faster and uses less memory than DOM parser.
我们需要使用下面的SAX分析器类和接口来读取Java中的XML文件。
javax.xml.parsers.SAXParser
提供了一个使用事件处理程序来解析XML文档的方法。这个类实现了XMLReader接口,并提供了parse()
方法的重载版本,以便从File
、InputStream
、SAX InputSource
和String URI读取XML文档。org.xml.sax.ContentHandler
接口来创建我们自己的处理程序类。这个接口包含回调方法,在事件发生时接收通知。例如StartDocument
、EndDocument
、StartElement
、EndElement
、CharacterData
等。org.xml.sax.helpers.DefaultHandler
提供了ContentHandler
接口的默认实现,我们可以扩展这个类来创建我们自己的处理器。建议扩展这个类,因为我们可能只需要实现其中的几个方法。扩展这个类可以使我们的代码更加简洁和可维护。sax_users.xml
文件(我们将读取的XML文件)下面是这个程序中要读取的XML文件。
<?xmlversion="1.0"encoding="UTF-8"?>
<Users>
<User id= "1">
<firstName>Ramesh</firstName>
<lastName>Fadatare</lastName>
<age>28</age>
<gender>Male</gender>
</User>
<User id= "2">
<firstName>John</firstName>
<lastName>Cena</lastName>
<age>45</age>
<gender>Male</gender>
</User>
<User id= "3">
<firstName>Tom</firstName>
<lastName>Cruise</lastName>
<age>40</age>
<gender>Male</gender>
</User>
</Users>
让我们创建我们自己的SAX解析器处理程序类,扩展DefaultHandler类。
package net.javaguides.javaxmlparser.sax;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class UserHandler extends DefaultHandler {
private boolean hasFirstName = false;
private boolean hasLastName = false;
private boolean hasAge = false;
private boolean hasGender = false;
// List to hold Users object
private List < User > userList = null;
private User user = null;
// getter method for userloyee list
public List < User > getEmpList() {
return userList;
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("User")) {
// create a new User and put it in Map
String id = attributes.getValue("id");
// initialize User object and set id attribute
user = new User();
user.setId(Integer.parseInt(id));
// initialize list
if (userList == null)
userList = new ArrayList < > ();
} else if (qName.equalsIgnoreCase("firstName")) {
// set boolean values for fields, will be used in setting User variables
hasFirstName = true;
} else if (qName.equalsIgnoreCase("age")) {
hasAge = true;
} else if (qName.equalsIgnoreCase("gender")) {
hasGender = true;
} else if (qName.equalsIgnoreCase("lastName")) {
hasLastName = true;
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("User")) {
// add User object to list
userList.add(user);
}
}
@Override
public void characters(char ch[], int start, int length) throws SAXException {
if (hasAge) {
// age element, set User age
user.setAge(Integer.parseInt(new String(ch, start, length)));
hasAge = false;
} else if (hasFirstName) {
user.setFirstName(new String(ch, start, length));
hasFirstName = false;
} else if (hasLastName) {
user.setLastName(new String(ch, start, length));
hasLastName = false;
} else if (hasGender) {
user.setGender(new String(ch, start, length));
hasGender = false;
}
}
}
所以这个XML是用户的列表,为了读取这个XML文件,我们将创建一个bean对象User
,然后我们将解析XML以获得用户的列表。
这里是User bean对象。
package net.javaguides.javaxmlparser.sax;
public class User {
private int id;
private String firstName;
private String lastName;
private int age;
private String gender;
public int getId() {
return id;
}
public void setId(int i) {
this.id = i;
}
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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "User [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", age=" + age + ", gender=" +
gender + "]";
}
}
package net.javaguides.javaxmlparser.sax;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class ReadXMLSAXParser {
public static void main(String[] args) {
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
try {
SAXParser saxParser = saxParserFactory.newSAXParser();
UserHandler handler = new UserHandler();
saxParser.parse(new File("sax_users.xml"), handler);
// Get Users list
List < User > userList = handler.getEmpList();
// print user information
for (User user: userList)
System.out.println(user);
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
}
}
上述程序的一个输出是
User [id=1, firstName=Ramesh, lastName=Fadatare, age=28, gender=Male]
User [id=2, firstName=John, lastName=Cena, age=45, gender=Male]
User [id=3, firstName=Tom, lastName=Cruise, age=40, gender=Male]
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.javaguides.net/2018/10/how-to-read-xml-file-in-java-sax-parser.html
内容来源于网络,如有侵权,请联系作者删除!