Java Xml 简明教程

Java DOM Parser - Query XML Document

Java DOM 解析器是 java 中的一个 API,用于解析和查询 XML 文稿。使用 Java DOM 解析器,我们可以查询大型 XML 文稿以深入了解我们的数据。手动检查整个 XML 文稿以获取相关信息并不容易。我们可以使用 getElementsByTagName() 方法按其标签名称来查询 XML 元素。若要基于属性值进行查询,可以使用 getAttribute() 方法。

Query XML Using Java DOM Parser

我们可以使用以下步骤通过 DOM 解析器在 Java 中查询任何 XML 文稿:

  1. 步骤 1: 创建 DocumentBuilder 对象

  2. 步骤 2: 读取 XML

  3. 步骤 3: 解析 XML 文稿

  4. 步骤 4: 查询 XML 文稿

请参阅 this page 以了解前三个步骤。

Step4: Querying the XML Document

按照前三个步骤操作后,我们可以使用 DOM 方法根据我们的业务要求对 XML 文稿进行查询。

Querying Elements by TagName

我们可以用 Document 接口上的 getElementsByTagName('carname') 方法通过标签名查询 XML 元素。此方法将采用 String 形式的标签名,并返回一个 NodeList,其中包含标签名相同的节点列表。

Node 接口的 getTextContent() 方法采用 String 形式给出节点内部的文本内容。

cars.xml

cars.xml 文件在根元素 <cars> 内部有七个 <carname> 元素。

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

Query XML Elements

在下面的程序中,我们已将所有节点获取到一个 nodeList 中,然后迭代每个节点以获取文本内容,并检查文本内容是否等于“Bentley 2”。如果找到,我们会在控制台上打印已找到;如果没有找到,我们会打印未找到。

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

public class QueryXMLDemo {

   public static void main(String argv[]) {

      try {

         //Creating a DocumentBuilder Object
         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();

         //Reading the XML file
         File inputFile = new File("cars.xml");

         //Parsing the XML Document
         Document doc = dBuilder.parse(inputFile);

         //checking "Bentley 2" car
         int flag=0;
         NodeList nList = doc.getElementsByTagName("carname");
         for(int i=0;i<nList.getLength();i++) {
            if(nList.item(i).getTextContent().equals("Bentley 2")) {
            	System.out.println("Bentley 2 car is "+"found");
            	flag=1;
            	break;
            }
         }
         if(flag==0) {
            System.out.println("Bentley 2 car is "+"not found");
         }
      } catch (Exception e) {e.printStackTrace();}
   }
}

Output

因为存在“Bentley 2”汽车,因此会显示已找到。

Bentley 2 car is found

Querying Elements by Attributes

我们可以使用 Element 接口的 getAttribute("Attribute_name") 方法通过属性查询元素。此方法将采用属性名称作为参数,并返回属性值。

Example

在下面的程序中,我们已解析 cars.xml 文件,并且会在每次找到“Bentley”时增加计数变量。

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

public class QueryXMLAttributes {

   public static void main(String argv[]) {

      try {

    	 //Creating a DocumentBuilder Object
         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();

         //Reading the XML file
         File inputFile = new File("cars.xml");

         //Parsing the XML Document
         Document doc = dBuilder.parse(inputFile);

         //counting Bentley cars
         int count=0;
         NodeList nList = doc.getElementsByTagName("carname");
         for(int i=0;i<nList.getLength();i++) {
        	Element ele = (Element) nList.item(i);
            if(ele.getAttribute("company").equals("Bentley")) {
            	count++;
            }
         }
         System.out.println("No of Bentley cars: "+ count);
      } catch (Exception e) {e.printStackTrace();}
   }
}

Output

上述程序会计算 Bentley 汽车的数量,并显示在控制台上。

No of Bentley cars: 3