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
廣告