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

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

在上一篇文章中,我们已经讨论了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()方法的重载版本,以便从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文件。

<?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>

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

让我们创建我们自己的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;
        }
    }
}

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

所以这个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 + "]";
    }
}

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

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]

相关文章