Java DOM4J 解析器 - 查詢 XML 文件



Java DOM4J 解析器是一個開源的 Java 庫,用於解析 XML 文件並查詢其中的必要資訊。我們可以使用 DOM4J 的 Document 和 Element 介面的方法來查詢 XML 文件。elements() 方法檢索根元素的所有元素。使用 attributeValue() 方法,我們可以查詢元素的屬性。

使用 Java DOM4J 解析器查詢 XML

以下是使用 Java DOM4J 解析器查詢文件時使用的步驟:

  • 步驟 1:建立 SAXReader 物件
  • 步驟 2:讀取 XML 檔案
  • 步驟 3:解析 XML
  • 步驟 4:提取根元素
  • 步驟 5:查詢文件

有關前四個步驟,請參考本節的解析 XML 文件章節。

步驟 5:查詢文件

在步驟 4 中提取根元素後,我們可以使用根元素查詢子元素。現在我們將透過查詢元素和屬性來查詢 XML 文件。

查詢元素

要獲取具有特定名稱的元素,我們可以使用 Element 介面的 elements() 方法,並將我們需要獲取的元素的名稱(以字串形式)作為引數傳遞給該方法。此方法返回具有相同名稱的元素列表。

Element 介面的 getData() 方法以字串形式返回文字資料。要根據其文字內容查詢元素,我們可以將此方法與 equals() 方法一起用於比較。

示例

以下是我們需要查詢的 cars.xml 檔案:

<?xml version = "1.0"?>
<cars>
      <carname company="Ferarri" >Ferarri 101</carname>
      <carname company="Lamborgini">Lamborgini 001</carname>
      <carname company="Lamborgini">Lamborgini 002</carname>
      <carname company="Lamborgini">Lamborgini 003</carname>
      <carname company="Bentley">Bentley 1</carname>
      <carname company="Bentley">Bentley 2</carname>
      <carname company="Bentley">Bentley 3</carname>
</cars>

使用 QueryElements.java 程式,我們查詢 cars.xml 檔案以查詢是否存在“Bentley 2”汽車。我們從 elements() 方法獲取所有“carname”元素,並使用 getData() 方法比較文字內容。

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

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

         //Extracting the root
         Element RootElement = document.getRootElement();

         List<Element> elements = RootElement.elements("carname");
         boolean found = false;
         
         //Iterating over the List
         for (Element ele : elements) {
        	    if(ele.getData().equals("Bentley 2")) {
        	    	found = true;      	    	
        	    }
         }
         if(found) {
        	 System.out.println("Bentley 2 car is found");
         }
         else {
        	 System.out.println("Bentley 2 car is not found");
         }	 
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

輸出

輸出視窗顯示文件中找到了“Bentley 2”汽車。

Bentley 2 car is found

查詢屬性

我們可以使用 attributeValue() 方法查詢 Element 介面的特定屬性。我們可以將屬性名稱(字串值)作為引數傳遞給此方法,它將值作為字串返回。

示例 1

以下 QueryAttributes.java 程式獲取“carname”元素的列表,並檢查其屬性“company”的值是否等於“Bentley”,如果相等則整數變數“count”遞增。

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 QueryAttributes {
   public static void main(String[] args) {
      try {
    	  
    	//Creating SAXReader
          SAXReader reader = new SAXReader();
          
     	 //Reading the XML file
          File inputFile = new File("cars.xml");
          
          //Parsing the XML
          Document document = reader.read(inputFile);

          //Extracting the root
          Element RootElement = document.getRootElement();
          
         List<Element> elements = RootElement.elements("carname");
         int count = 0;
         
         for (Element ele : elements) {
        	    if(ele.attributeValue("company").equals("Bentley")) 
        	    	count++;
         }
        	 System.out.println("No of Bentley cars found: " + count);	 
      } catch (DocumentException e) {
         e.printStackTrace();
      }
   }
}

輸出

輸出視窗顯示在文件中找到的賓利汽車數量。

No of Bentley cars found: 3

示例 2

考慮以下 studentData.xml 檔案,其中根元素“class”內包含三個 student 元素。現在讓我們嘗試列印學號為 493 的學生的資訊。

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

以下 QueryStudent.java 程式獲取根元素“class”的所有元素。它將學號屬性的值與“493”進行比較。如果匹配,則使用 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 QueryStudent {
   public static void main(String[] args) {
      try {
    	  
         //Creating SAXReader
         SAXReader reader = new SAXReader();
          
     	 //Reading the XML file
         File inputFile = new File("studentData.txt");
          
         //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("----------------------------");        
         for (Element ele : elements) {
        	 if(ele.attributeValue("rollno").equals("493")) {
             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();
      }
   }
}

輸出

顯示學號為 493 的學生的所有詳細資訊。

Root element :class
----------------------------

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