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