- Java XML 教程
- Java XML 首页
- Java XML 概述
- Java XML 解析器
- Java DOM 解析器
- Java DOM 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java SAX 解析器
- Java SAX 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- JDOM XML 解析器
- JDOM XML 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java StAX 解析器
- Java StAX 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java XPath 解析器
- Java XPath 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java DOM4J 解析器
- Java DOM4J 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java XML 有用资源
- Java XML - 常见问题解答
- Java XML - 快速指南
- Java XML - 有用资源
- Java XML - 讨论
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