如何在Java中读取XML文件--SAX解析器

x33g5p2x  于2022-10-06 转载在 Java  
字(5.3k)|赞(0)|评价(0)|浏览(879)

在上一篇文章中,我们已经讨论了Java中的reading XML file using DOM parser。现在在这篇文章中,我们将学习如何使用SAX分析器在Java中读取XML文件。
SAX解析器的工作方式与DOM解析器不同,它既不加载任何XML文档到内存中,也不创建XML文档的对象表示。相反,SAX解析器使用回调函数(org.xml.sax.helpers.DefaultHandler)来通知客户XML文档的结构.

  1. SAX Parser is faster and uses less memory than DOM parser.

我们需要使用下面的SAX分析器类和接口来读取Java中的XML文件。

  • javax.xml.parsers.SAXParser提供了一个使用事件处理程序来解析XML文档的方法。这个类实现了XMLReader接口,并提供了parse()方法的重载版本,以便从FileInputStreamSAX InputSource和String URI读取XML文档。
  • 实际的解析是由处理程序类完成的。我们需要创建我们自己的处理程序类来解析XML文档。我们需要实现org.xml.sax.ContentHandler接口来创建我们自己的处理程序类。这个接口包含回调方法,在事件发生时接收通知。例如StartDocumentEndDocumentStartElementEndElementCharacterData等。
  • org.xml.sax.helpers.DefaultHandler提供了ContentHandler接口的默认实现,我们可以扩展这个类来创建我们自己的处理器。建议扩展这个类,因为我们可能只需要实现其中的几个方法。扩展这个类可以使我们的代码更加简洁和可维护。

开发过程步骤

  1. 输入sax_users.xml文件(我们将读取的XML文件)
  2. 创建SAX解析器处理程序类,扩展DefaultHandler类
  3. 创建用户类(将XML数据填充到用户对象中)。
  4. 使用Java DOM解析器在Java中读取XML文件的程序

1. 输入 users.xml文件(我们将读取的XML文件)

下面是这个程序中要读取的XML文件。

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <Users>
  3. <User id= "1">
  4. <firstName>Ramesh</firstName>
  5. <lastName>Fadatare</lastName>
  6. <age>28</age>
  7. <gender>Male</gender>
  8. </User>
  9. <User id= "2">
  10. <firstName>John</firstName>
  11. <lastName>Cena</lastName>
  12. <age>45</age>
  13. <gender>Male</gender>
  14. </User>
  15. <User id= "3">
  16. <firstName>Tom</firstName>
  17. <lastName>Cruise</lastName>
  18. <age>40</age>
  19. <gender>Male</gender>
  20. </User>
  21. </Users>

2. 创建SAX解析器处理程序类,扩展DefaultHandler类

让我们创建我们自己的SAX解析器处理程序类,扩展DefaultHandler类。

  1. package net.javaguides.javaxmlparser.sax;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.xml.sax.Attributes;
  5. import org.xml.sax.SAXException;
  6. import org.xml.sax.helpers.DefaultHandler;
  7. public class UserHandler extends DefaultHandler {
  8. private boolean hasFirstName = false;
  9. private boolean hasLastName = false;
  10. private boolean hasAge = false;
  11. private boolean hasGender = false;
  12. // List to hold Users object
  13. private List < User > userList = null;
  14. private User user = null;
  15. // getter method for userloyee list
  16. public List < User > getEmpList() {
  17. return userList;
  18. }
  19. @Override
  20. public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  21. if (qName.equalsIgnoreCase("User")) {
  22. // create a new User and put it in Map
  23. String id = attributes.getValue("id");
  24. // initialize User object and set id attribute
  25. user = new User();
  26. user.setId(Integer.parseInt(id));
  27. // initialize list
  28. if (userList == null)
  29. userList = new ArrayList < > ();
  30. } else if (qName.equalsIgnoreCase("firstName")) {
  31. // set boolean values for fields, will be used in setting User variables
  32. hasFirstName = true;
  33. } else if (qName.equalsIgnoreCase("age")) {
  34. hasAge = true;
  35. } else if (qName.equalsIgnoreCase("gender")) {
  36. hasGender = true;
  37. } else if (qName.equalsIgnoreCase("lastName")) {
  38. hasLastName = true;
  39. }
  40. }
  41. @Override
  42. public void endElement(String uri, String localName, String qName) throws SAXException {
  43. if (qName.equalsIgnoreCase("User")) {
  44. // add User object to list
  45. userList.add(user);
  46. }
  47. }
  48. @Override
  49. public void characters(char ch[], int start, int length) throws SAXException {
  50. if (hasAge) {
  51. // age element, set User age
  52. user.setAge(Integer.parseInt(new String(ch, start, length)));
  53. hasAge = false;
  54. } else if (hasFirstName) {
  55. user.setFirstName(new String(ch, start, length));
  56. hasFirstName = false;
  57. } else if (hasLastName) {
  58. user.setLastName(new String(ch, start, length));
  59. hasLastName = false;
  60. } else if (hasGender) {
  61. user.setGender(new String(ch, start, length));
  62. hasGender = false;
  63. }
  64. }
  65. }

3. 创建User类 (将XML数据填充到User对象中)

所以这个XML是用户的列表,为了读取这个XML文件,我们将创建一个bean对象User,然后我们将解析XML以获得用户的列表。

这里是User bean对象。

  1. package net.javaguides.javaxmlparser.sax;
  2. public class User {
  3. private int id;
  4. private String firstName;
  5. private String lastName;
  6. private int age;
  7. private String gender;
  8. public int getId() {
  9. return id;
  10. }
  11. public void setId(int i) {
  12. this.id = i;
  13. }
  14. public String getFirstName() {
  15. return firstName;
  16. }
  17. public void setFirstName(String firstName) {
  18. this.firstName = firstName;
  19. }
  20. public String getLastName() {
  21. return lastName;
  22. }
  23. public void setLastName(String lastName) {
  24. this.lastName = lastName;
  25. }
  26. public int getAge() {
  27. return age;
  28. }
  29. public void setAge(int age) {
  30. this.age = age;
  31. }
  32. public String getGender() {
  33. return gender;
  34. }
  35. public void setGender(String gender) {
  36. this.gender = gender;
  37. }
  38. @Override
  39. public String toString() {
  40. return "User [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", age=" + age + ", gender=" +
  41. gender + "]";
  42. }
  43. }

4. 使用Java SAX解析器在Java中读取XML文件的程序

  1. package net.javaguides.javaxmlparser.sax;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.util.List;
  5. import javax.xml.parsers.ParserConfigurationException;
  6. import javax.xml.parsers.SAXParser;
  7. import javax.xml.parsers.SAXParserFactory;
  8. import org.xml.sax.SAXException;
  9. public class ReadXMLSAXParser {
  10. public static void main(String[] args) {
  11. SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
  12. try {
  13. SAXParser saxParser = saxParserFactory.newSAXParser();
  14. UserHandler handler = new UserHandler();
  15. saxParser.parse(new File("sax_users.xml"), handler);
  16. // Get Users list
  17. List < User > userList = handler.getEmpList();
  18. // print user information
  19. for (User user: userList)
  20. System.out.println(user);
  21. } catch (ParserConfigurationException | SAXException | IOException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }

上述程序的一个输出是

  1. User [id=1, firstName=Ramesh, lastName=Fadatare, age=28, gender=Male]
  2. User [id=2, firstName=John, lastName=Cena, age=45, gender=Male]
  3. User [id=3, firstName=Tom, lastName=Cruise, age=40, gender=Male]

相关文章

最新文章

更多