Java DOM4J 解析器 - 解析 XML 文档



Java DOM4J 解析器是 Java 中用于解析 XML 文档的 API。它从内置的 SAX 解析器或 DOM 解析器创建 DOM4J 文档。获取文档后,我们可以使用 DOM4J Document 和 Element 接口的内置方法检索元素和属性的信息。

在本章中,我们使用了 getRootElement() 来提取文档的根元素,并使用 elements() 方法获取其所有子元素。

使用 Java DOM4J 解析器解析 XML

以下是使用 Java DOM4J 解析器解析文档时使用的步骤:

  • 步骤 1:创建 SAXReader 对象
  • 步骤 2:读取 XML 文件
  • 步骤 3:解析 XML
  • 步骤 4:提取根元素
  • 步骤 5:检索元素

步骤 1:创建 SAXReader 对象

SAXReader 类用于从 XML 文件或流创建 DOM4J 文档。它具有自己的内置 SAX 解析器来解析文件。我们如下创建 SAXReader 对象:

SAXReader reader = new SAXReader();

步骤 2:读取 XML 文件

要将 XML 内容读取为字符串,我们可以使用 StringBuilder 类,然后将其转换为 ByteStream 以创建 XML 文档。如果 XML 内容以文件形式提供,我们可以使用 java.io 的 File 类读取它,如下所示:

File inputFile = new File("src/input.txt");

步骤 3:解析 XML

要解析 XML 文件,我们在步骤 1 中创建了 SAXReader 对象。使用 SAXReader 的 read() 方法,我们通过将步骤 2 中读取的文件作为参数传递来创建 DOM4J 文档,如下所示:

Document document = reader.read(inputFile);

步骤 4:提取根元素

需要从 DOM4J 文档中提取根元素才能获取任何元素信息。使用 Document 接口的 getRootElement() 方法,我们获取根元素,如下所示:

Element RootElement = document.getRootElement();

步骤 5:检索元素

在完成前四个步骤后,我们现在拥有了根元素来获取其子元素的信息。现在,我们将执行一些任务,例如检索根元素、检索属性和检索 XML 文档的元素文本,并提供示例。

检索根元素

Document 接口的 getRootElement() 方法以 Element 对象的形式返回文档的根元素。要获取元素的名称,我们使用 Element 接口的 getName() 方法。它以字符串的形式返回元素的名称。

示例

我们需要解析的 studentData.xml 文件如下所示:

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>dinkar</firstname>
      <lastname>kad</lastname>
      <nickname>dinkar</nickname>
      <marks>85</marks>
   </student>
   
   <student rollno = "493">
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">
      <firstname>jasvir</firstname>
      <lastname>singn</lastname>
      <nickname>jazz</nickname>
      <marks>90</marks>
   </student>
</class>

RetrieveRoot.java 程序使用 SAXReader 读取上述 studentData.xml 文件并获取 DOM4J 文档。获取文档后,我们使用 getRootElement() 方法提取根元素。

import java.io.File;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class RetrieveRoot {
   public static void main(String[] args) {
      try {
    	  
    	 //Creating SAXReader
         SAXReader reader = new SAXReader();
         
         //Reading the XML file
         File inputFile = new File("studentData.xml");
 
         //Parsing the XML
         Document document = reader.read(inputFile);

         //Extracting the root
         Element RootElement = document.getRootElement();
         
         //Printing the Root Element Name
         System.out.println("Root element Name :" + RootElement.getName());
      } catch(Exception e) {
    	 e.printStackTrace();
      }
   }
}

输出

根元素名称“class”将显示在输出屏幕上。

Root element Name :class

检索属性

Element 接口的 attributeValue() 方法以字符串的形式检索指定属性的值。如果该元素没有这样的属性,则返回 null。如果属性没有指定值,则返回空字符串。

示例

以下 RetrieveAttributes.java 程序使用 attributeValue() 方法并检索所有 student 元素的学号。

import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class RetrieveAttributes {
   public static void main(String[] args) {
      try {
    	  
    	 //Creating SAXReader
         SAXReader reader = new SAXReader();
         
         //Reading the XML file
         File inputFile = new File("studentData.xml");
     
         //Parsing the XML
         Document document = reader.read(inputFile);

         //Extracting the root
         Element RootElement = document.getRootElement();
         
         //Iterating over the List
         List<Element> elements = RootElement.elements();
         System.out.println("Student Roll numbers - ");
         for (Element ele : elements) {
            System.out.println(ele.attributeValue("rollno") );
         }
      } catch(Exception e) {
    	 e.printStackTrace();
      }
   }
}

所有学生的学号将显示在输出屏幕上。

输出

Student Roll numbers - 
393
493
593

检索元素文本

Element 接口的 elements() 方法返回其中包含的 Element 列表。Element 接口的 elementText() 方法以字符串的形式返回元素的文本内容。

import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class DemoParse {
   public static void main(String[] args) {
      try {
    	  
         //Creating SAXReader
         SAXReader reader = new SAXReader();
    	  
    	 //Reading the XML file
         File inputFile = new File("studentData.xml"); 
         
         //Parsing the XML
         Document document = reader.read(inputFile);

         //Extracting the root
         Element RootElement = document.getRootElement();
         System.out.println("Root Element: " + RootElement.getName());
         List<Element> elements = RootElement.elements();
         System.out.println("---------------------------------");
         
         //Iterating over the List
         for (Element ele : elements) {
            System.out.println("\nCurrent Element :"
               + ele.getName());
            System.out.println("Student roll no : " 
               + ele.attributeValue("rollno") );
            System.out.println("First Name : "
               + ele.elementText("firstname"));
            System.out.println("Last Name : "
               + ele.elementText("lastname"));
            System.out.println("First Name : "
               + ele.elementText("nickname"));
            System.out.println("Marks : "
               + ele.elementText("marks"));
         }
      } catch (DocumentException e) {
         e.printStackTrace();
      }
   }
}

输出

所有学生的信息将显示在输出屏幕上。

Root Element: class
---------------------------------

Current Element :student
Student roll no : 393
First Name : dinkar
Last Name : kad
First Name : dinkar
Marks : 85

Current Element :student
Student roll no : 493
First Name : Vaneet
Last Name : Gupta
First Name : vinni
Marks : 95

Current Element :student
Student roll no : 593
First Name : jasvir
Last Name : singn
First Name : jazz
Marks : 90
广告