如何在Java中读取XML文件(DOM分析器)

时间:2020-02-23 14:34:37  来源:igfitidea点击:

今天,我们将学习如何用Java读取XML文件。
我们还将学习如何使用DOM解析器将Java中的XML文件解析为对象。

DOM XML分析器最容易理解。
它将XML对象作为Document加载到内存中,然后您可以轻松地遍历对象中的不同元素和节点。
元素和节点的遍历不需要按顺序进行。

如何用Java读取XML文件

DOM Parser适用于小型XML文档,但由于它将完整的XML文件加载到内存中,因此不适用于大型XML文件。
对于大型XML文件,应使用SAX Parser。

在本教程中,我们将读取XML文件并进行解析以从中创建对象。

这是将在此程序中读取的XML文件。

employee.xml

<?xml version="1.0"?>
<Employees>
	<Employee>
		<name>hyman</name>
		<age>29</age>
		<role>Java Developer</role>
		<gender>Male</gender>
	</Employee>
	<Employee>
		<name>Lisa</name>
		<age>35</age>
		<role>CSS Developer</role>
		<gender>Female</gender>
	</Employee>
</Employees>

因此,此XML是雇员列表,要读取此XML文件,我将创建一个bean对象Employee,然后我们将解析XML以获取雇员列表。

这是Employee bean对象。

package com.theitroad.xml;

public class Employee {
  private String name;
  private String gender;
  private int age;
  private String role;
  public String getName() {
      return name;
  }
  public void setName(String name) {
      this.name = name;
  }
  public String getGender() {
      return gender;
  }
  public void setGender(String gender) {
      this.gender = gender;
  }
  public int getAge() {
      return age;
  }
  public void setAge(int age) {
      this.age = age;
  }
  public String getRole() {
      return role;
  }
  public void setRole(String role) {
      this.role = role;
  }
  
  @Override
  public String toString() {
      return "Employee:: Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender +
              " Role=" + this.role;
  }
  
}

注意,我已经重写了toString()方法以打印有关员工的有用信息。

阅读这篇文章,以了解您应该始终使用@Override注解覆盖方法。

如果您不熟悉注释,请阅读Java注释教程。

Java DOM解析器

这是使用DOM解析器读取和解析XML文件以获得Employee对象列表的Java程序。

package com.theitroad.xml;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XMLReaderDOM {

  public static void main(String[] args) {
      String filePath = "employee.xml";
      File xmlFile = new File(filePath);
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder dBuilder;
      try {
          dBuilder = dbFactory.newDocumentBuilder();
          Document doc = dBuilder.parse(xmlFile);
          doc.getDocumentElement().normalize();
          System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
          NodeList nodeList = doc.getElementsByTagName("Employee");
          //now XML is loaded as Document in memory, lets convert it to Object List
          List<Employee> empList = new ArrayList<Employee>();
          for (int i = 0; i < nodeList.getLength(); i++) {
              empList.add(getEmployee(nodeList.item(i)));
          }
          //lets print Employee list information
          for (Employee emp : empList) {
              System.out.println(emp.toString());
          }
      } catch (SAXException | ParserConfigurationException | IOException e1) {
          e1.printStackTrace();
      }

  }

  private static Employee getEmployee(Node node) {
      //XMLReaderDOM domReader = new XMLReaderDOM();
      Employee emp = new Employee();
      if (node.getNodeType() == Node.ELEMENT_NODE) {
          Element element = (Element) node;
          emp.setName(getTagValue("name", element));
          emp.setAge(Integer.parseInt(getTagValue("age", element)));
          emp.setGender(getTagValue("gender", element));
          emp.setRole(getTagValue("role", element));
      }

      return emp;
  }

  private static String getTagValue(String tag, Element element) {
      NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();
      Node node = (Node) nodeList.item(0);
      return node.getNodeValue();
  }

}

上面程序的输出是:

Root element :Employees
Employee:: Name=hyman Age=29 Gender=Male Role=Java Developer
Employee:: Name=Lisa Age=35 Gender=Female Role=CSS Developer

在现实生活中,在将XML文件解析为对象之前验证XML文件,学习如何在Java中针对XSD验证XML并不是一个坏主意。