Java Xml 简明教程
Java SAX Parser - Query XML Document
Java SAX Parser 是 java 中的 API,可用于查询 XML 文档。要使用基于事件的 API 查询大型 XML 文档,我们可以使用 Java SAX parser API。SAXParser API 存在于 javax.xml.parsers 包内。我们可以通过继承 ContentHandler 接口的反过来继承 DefaultHandler 类的 Handler 类中的回调方法来查询任何 XML 文档。
Query XML using Java SAX parser
我们可以通过以下步骤使用 SAX parser 在 Java 中查询任何 XML 文档 -
-
步骤 1: 实施一个 Handler 类
-
步骤 2: 创建一个 SAXParser 对象
-
步骤 3: 读取 XML
-
步骤 4: 为 Handler 类创建对象
-
步骤 5: 解析 XML 文档
-
*第 6 步:*查询元素
有关前五个步骤,请参考 this chapter 。
Querying Elements by TextContent
characters() 方法用于获取元素的内容。 endDocument() 函数在文档结尾处调用。我们可以使用此方法在关闭 XML 文件之前执行一些我们需要的必要操作。
Example
我们需要查询以下 cars.xml 文件以找出文档中是否存在“宾利 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() 函数中查找宾利汽车,并在 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 2 car is found
Querying Elements by Attributes
我们可以使用 Attributes 接口通过其属性查询元素。我们从 startElement() 函数中将元素的属性列表作为最后一个参数获取。如前一章所述, getValue("attr_name") 函数用于获取属性值。
Example
让我们使用我们在前一个示例中使用的 cars.xml 文件来计算宾利汽车的数量。此信息只能通过属性值获取。当解析器遇到元素时,我们使用 getValue("company") 获取公司属性并在该公司为宾利时增加计数。
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