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