Java DOM 解析器 - 解析 XML 文件



Java DOM 解析器是一個 Java API,用於解析任何 XML 文件。 使用提供的方法,我們可以使用 Java DOM 解析器檢索根元素、子元素及其屬性。

在本教程中,我們使用了getTagName()方法來檢索元素的標籤名稱,使用getFirstChild()來檢索元素的第一個子元素,並使用getTextContent()來獲取元素的文字內容。

使用 Java DOM 解析器解析 XML

在討論了 Java 中可用的各種 XML 解析器之後,現在讓我們看看如何使用 DOM 解析器來解析 XML 檔案。 我們使用parse()方法來解析 XML 檔案。 在直接進入示例之前,讓我們看看使用 Java DOM 解析器解析 XML 文件的步驟:

  • 步驟 1:建立 DocumentBuilder 物件
  • 步驟 2:讀取 XML
  • 步驟 3:解析 XML 文件
  • 步驟 4:檢索元素

步驟 1:建立 DocumentBuilder 物件

DocumentBuilderFactory 是一個工廠 API,透過建立 DOM 樹來獲取用於解析 XML 文件的解析器。 它具有 'newDocumentBuilder()' 方法,該方法建立 'DocumentBuilder' 類的例項。 此 DocumentBuilder 類用於獲取流、檔案、URL 和 SAX InputSource 形式的輸入。

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();

步驟 2:讀取 XML

輸入可以是檔案型別或流型別。 要輸入 XML 檔案,請建立一個檔案物件並將檔案路徑作為引數傳遞。

File xmlFile = new File("input.xml");

為了以流的形式獲取輸入,我們使用了 StringBuilder 類並附加了輸入字串,然後將其轉換為位元組。 將獲得的 ByteArrayInputStream 作為輸入提供給文件。

StringBuilder xmlBuilder = new StringBuilder(); 
xmlBuilder.append("<?xml version="1.0"?> <rootElement></rootElement>");
ByteArrayInputStream input = new ByteArrayInputStream( xmlBuilder.toString().getBytes("UTF-8"));

步驟 3:解析 XML 文件

在上述步驟中建立的 DocumentBuilder 用於解析輸入 XML 檔案。 它包含一個名為 parse() 的方法,該方法接受檔案或輸入流作為引數並返回 DOM Document 物件。 如果給定的檔案或輸入流為 NULL,則此方法將丟擲 IllegalArgumentException。

Document xmldoc = docBuilder.parse(input);

步驟 4:檢索元素

org.w3c.dom.包的 Node 和 Element 介面提供各種方法來從 XML 文件中檢索有關元素的所需資訊。 此資訊包括元素的名稱、文字內容、屬性及其值。 我們有很多 DOM 介面和方法可以獲取此資訊。

檢索根元素名稱

XML 文件包含許多元素。 在 Java 中,XML/HTML 文件由名為Element的介面表示。 此介面提供各種方法來檢索、新增和修改 XML/HTML 文件的內容。

我們可以使用 Element 介面的getTagName()方法檢索根元素的名稱。 它以字串的形式返回根元素的名稱。

由於 Element 是一個介面,因此要建立其物件,我們需要使用getDocumentElement()方法。 此方法檢索並以物件的形式返回根元素。

示例

在下面的示例中,我們使用 StringBuilder 類傳遞了一個只有一個根元素 'college' 的簡單 XML 文件。 然後,我們檢索它並列印到控制檯。

import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.ByteArrayInputStream;
import javax.xml.parsers.DocumentBuilder;

public class RetrieveRootElementName {
   public static void main(String[] args) {
      try {      
         //Creating a DocumentBuilder Object
         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
	     DocumentBuilder docBuilder = factory.newDocumentBuilder();
	    	  
         //Reading the XML
         StringBuilder xmlBuilder = new StringBuilder(); 
         xmlBuilder.append("<college></college>");
	    	  
         //Parsing the XML Document
         ByteArrayInputStream input = new ByteArrayInputStream(xmlBuilder.toString().getBytes("UTF-8"));
         Document xmldoc = docBuilder.parse(input);
	    	  
         //Retrieving the Root Element Name
         Element element = xmldoc.getDocumentElement();	    	  
         System.out.println("Root element name is "+element.getTagName());
	    	  
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

輸出

元素名稱“college”顯示在輸出螢幕上,如下所示:

Root element name is college

解析 XML 中的單個子元素

我們可以解析根元素內只有一個元素的簡單 XML 文件。 到目前為止,我們已經看到了如何檢索根元素。 現在,讓我們看看如何獲取根元素內的子元素。

由於我們只有一個子元素,因此我們使用getFirstChild()方法來檢索它。 此方法與根元素一起使用以獲取其第一個子元素。 它以 Node 物件的形式返回子節點。

檢索子節點後,使用getNodeName()方法獲取節點的名稱。 它以字串的形式返回節點名稱。

要獲取文字內容,我們使用getTextContent()方法。 它以字串的形式返回文字內容。

示例

讓我們看看下面的示例,其中我們有一個根元素和一個子元素。 這裡,“college”是根元素,其中“department”作為子元素。“department”元素具有文字內容“Computer Science”。 我們正在檢索子元素的名稱和文字內容。

import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import java.io.ByteArrayInputStream;
import javax.xml.parsers.DocumentBuilder;

public class SingleSubElement {
   public static void main(String[] args) {
	
      try {
             	  
    	 //Creating a DocumentBuilder Object
         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    	 DocumentBuilder docBuilder = factory.newDocumentBuilder();
    	  
    	 //Reading the XML
    	 StringBuilder xmlBuilder = new StringBuilder(); 
    	 xmlBuilder.append("<college><department>Computer Science</department></college>");
    	  
    	 //Parsing the XML Document
    	 ByteArrayInputStream input = new ByteArrayInputStream(xmlBuilder.toString().getBytes("UTF-8"));
    	 Document xmldoc = docBuilder.parse(input);
    	 
    	 //Retrieving the Root Element
	     Element element = xmldoc.getDocumentElement();
	     
	     //Retrieving the Child Node
	     Node childNode = element.getFirstChild();
	     String childNodeName = childNode.getNodeName();
	     System.out.println("Sub Element name : " + childNodeName);
	     //Retrieving Text Content of the Child Node "+ childNodeName);
	     
	     System.out.println("Text content of Sub Element : "+childNode.getTextContent());
    	 
      } catch (Exception e) {
    	  e.printStackTrace();
      }
   }
}

輸出視窗顯示子元素名稱和文字內容。

Sub Element name : department
Text content of Sub Element : Computer Science

解析 XML 中的多個元素

要解析具有多個元素的 XML 文件,我們需要使用迴圈。getChildNodes()方法檢索元素的所有子節點並將其作為 NodeList 返回。 我們需要遍歷獲得的 NodeList 的所有元素,並像在前面幾節中那樣檢索每個元素的所需資訊。

示例

現在,讓我們向 XML 檔案 (**multipleElements.xml**) 新增另外兩個部門。 讓我們嘗試檢索所有部門名稱和員工人數。

<college>
   <department>
      <name>Computer Science</name>
      <staffCount>20</staffCount>
   </department>
      <department>
      <name>Electrical and Electronics</name>
      <staffCount>23</staffCount>
   </department>
      <department>
      <name>Mechanical</name>
      <staffCount>15</staffCount>
   </department>
</college>    

在下面的程式中,我們將部門元素列表檢索到 NodeList 中,並迭代所有部門以獲取部門名稱和員工人數。

import java.io.File;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;

public class MultipleElementsXmlParsing {
   public static void main(String[] args) {      		
      try {      
     	       	  
         //Input the XML file
	     File inputXmlFile = new File("src/multipleElements.xml");
	           
	     //creating DocumentBuilder
	     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
	     DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
	     Document xmldoc = docBuilder.parse(inputXmlFile);
	     
	     //Retrieving the Root Element
	     Element element = xmldoc.getDocumentElement();
	     System.out.println("Root element name is "+element.getTagName());
	           
	     //Getting the child elements List
	     NodeList nList = element.getChildNodes();
	           
	     //Iterating through all the child elements of the root
	     for (int temp = 0; temp < nList.getLength(); temp++) {      
            Node nNode = nList.item(temp);
	        System.out.println("\nCurrent Element :" + nNode.getNodeName());
	             
	        if (nNode.getNodeType() == Node.ELEMENT_NODE) {     
               Element eElement = (Element) nNode;
	           System.out.println("Name of the department : " + eElement.getElementsByTagName("name").item(0).getTextContent());
	           System.out.println("Staff Count of the department : " + eElement.getElementsByTagName("staffCount").item(0).getTextContent());
	        }
         }
      } catch (Exception e) {
	         e.printStackTrace();
      }
   }
}

顯示所有三個部門及其名稱和員工人數。

Root element :college

Current Element :department
Name of the department : Computer Science
Staff Count of the department : 20

Current Element :department
Name of the department : Electrical and Electronics
Staff Count of the department : 23

Current Element :department
Name of the department : Mechanical
Staff Count of the department : 15

解析 XML 中的屬性

XML 元素可以具有屬性,這些屬性可以使用getAttribute()方法檢索。 此方法將屬性名稱作為引數,並將相應的屬性值作為字串返回。如果指定的屬性名稱沒有屬性值或預設值,則返回空字串。

示例

現在,讓我們向“**attributesParsing.xml**”檔案中的所有部門元素新增一個屬性“deptcode”。

<?xml version = "1.0"?>
<college>
   <department deptcode = "DEP_CS23">
      <name>Computer Science</name>
      <staffCount>20</staffCount>
   </department>
   
   <department deptcode = "DEP_EC34">
      <name>Electrical and Electronics</name>
      <staffCount>23</staffCount>
   </department>
   
   <department deptcode = "DEP_MC89">
      <name>Mechanical</name>
      <staffCount>15</staffCount>
   </department>
</college>   

在下面的程式中,我們正在檢索每個部門的 deptcode、名稱和員工人數。

import java.io.File;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;

public class AttributesXmlParsing {
   public static void main(String[] args) {	
      try {      	  
	     //Input the XML file
	     File inputXmlFile = new File("attributesParsing.xml");
	      
	     //creating DocumentBuilder
	     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
	     DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
	     Document xmldoc = docBuilder.parse(inputXmlFile);
	      
	     //Getting the root element
	     System.out.println("Root element :" + xmldoc.getDocumentElement().getNodeName());
	     NodeList nList = xmldoc.getElementsByTagName("department");
	      
	     //Iterating through all the child elements of the root
	     for (int temp = 0; temp < nList.getLength(); temp++) {      
            Node nNode = nList.item(temp);
            System.out.println("\nCurrent Element :" + nNode.getNodeName());
	        
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {     
               Element eElement = (Element) nNode;
               System.out.println("Department Code : " + eElement.getAttribute("deptcode"));
               System.out.println("Name of the department : " + eElement.getElementsByTagName("name").item(0).getTextContent());
               System.out.println("Staff Count of the department : " + eElement.getElementsByTagName("staffCount").item(0).getTextContent());
            }
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

顯示三個部門及其相應的部門程式碼、名稱和員工人數。

Root element :college

Current Element :department
Department Code : DEP_CS23
Name of the department : Computer Science
Staff Count of the department : 20

Current Element :department
Department Code : DEP_EC34
Name of the department : Electrical and Electronics
Staff Count of the department : 23

Current Element :department
Department Code : DEP_MC89
Name of the department : Mechanical
Staff Count of the department : 15
廣告