Java SAX 解析器 - 查询 XML 文档



Java SAX 解析器是 Java 中的一个 API,可用于查询 XML 文档。要使用基于事件的 API 查询大型 XML 文档,可以使用 Java SAX 解析器 API。SAXParser API 位于 javax.xml.parsers 包中。可以通过继承 DefaultHandler 类(它又继承 ContentHandler 接口)并在 Handler 类中实现回调方法来查询任何 XML 文档。

使用 Java SAX 解析器查询 XML

可以使用以下步骤通过 Java SAX 解析器查询任何 XML 文档:

  • 步骤 1:实现 Handler 类
  • 步骤 2:创建 SAXParser 对象
  • 步骤 3:读取 XML
  • 步骤 4:创建 Handler 类对象
  • 步骤 5:解析 XML 文档
  • 步骤 6:查询元素

关于前五个步骤,请参考 本章节

步骤 6:查询元素

ContenHnadler 和 Attributes 接口提供多种方法,可帮助我们查询元素及其属性。为了查询所需信息,我们在 Handler 类中实现代码。

按文本内容查询元素

characters() 方法用于获取元素的内容。endDocument() 函数在文档末尾调用。我们可以使用此方法执行在关闭 XML 文件之前需要执行的一些必要操作。

示例

我们需要查询以下 cars.xml 文件,以确定文档中是否存在“Bentley 2”汽车。

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

在下面的 Java 程序中,我们在 UserHandler 类中实现了 characters() 和 endDocument() 方法。我们在 characters() 函数中编写了查找 Bentley 汽车的代码,并使用 endDocument() 方法打印最终结果。

import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

//Implementing UserHandler Class
class UserHandler extends DefaultHandler {
	
   boolean found = false;
	
   public void characters(char[] ch, int start, int length) throws SAXException{
	   String textContent = new String(ch,start,length);
	  if(textContent.equals("Bentley 2")) {
		  found=true;
	  }
   }
   public void endDocument() {
	   if(found)
	   System.out.println("Bentley 2 car is found");
	   else
	   System.out.println("Bentley 2 car is not Found");	  
   }
}

public class QueryXMLElements {
   public static void main(String args[]) {
      try {
	                  			
         //Creating a DocumentBuilder Object             	  
		 SAXParserFactory factory = SAXParserFactory.newInstance();
		 SAXParser saxParser = factory.newSAXParser();
		       
		 //Reading the XML
		 File xmlFile = new File("cars.xml");
		     
		 //Creating UserHandler object
		 UserHandler userHandler = new UserHandler();
		     
		 //Parsing the XML Document
		 saxParser.parse(xmlFile, userHandler);
		     
      } catch(Exception e) {
    	  e.printStackTrace();
	  }
   }
}

输出显示已找到 Bentley 汽车。

Bentley 2 car is found

按属性查询元素

可以使用 Attributes 接口按属性查询元素。我们从 startElement() 函数的最后一个参数中获取元素属性列表。如前一章所述,getValue("attr_name") 函数用于获取属性值。

示例

让我们使用我们在前面示例中使用的 cars.xml 文件来计算 Bentley 汽车的数量。此信息只能通过属性值获得。当解析器遇到元素时,我们使用 getValue("company") 获取公司属性,如果该公司是 Bentley,则递增计数。

import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

//Implementing UserHandler Class
class UserHandler extends DefaultHandler {
	
   int count=0;
   
   public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
	   String company = attributes.getValue("company");
	   if(qName.equals("carname") && company.equals("Bentley")) {
    	  count++;
      }  
   }
   public void endDocument() {
      System.out.println("No. of Bentley cars found : " + count);
   }
}

public class QueryXMLAttributes {
   public static void main(String args[]) {
      try {
	                  			
         //Creating a DocumentBuilder Object             	  
		 SAXParserFactory factory = SAXParserFactory.newInstance();
		 SAXParser saxParser = factory.newSAXParser();
		       
		 //Reading the XML
		 File xmlFile = new File("cars.xml");
		     
		 //Creating UserHandler object
		 UserHandler userHandler = new UserHandler();
		     
		 //Parsing the XML Document
		 saxParser.parse(xmlFile, userHandler);
		     
      } catch(Exception e) {
    	  e.printStackTrace();
	  }
   }
}

调用 endDocument() 方法时显示输出。

No.of Bentley cars found : 3
广告
© . All rights reserved.