1. 获取 SAX 解析器实例
XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
通过使用这个方法,您需要将系统属性 org.xml.sax.driver
设置成想要装入的解析器的类名。这是特定于供应商的类;对于 Xerces,它应该是 org.apache.xerces.parsers.SAXParser
。用 -D
开关将这个参数指定给 Java 编译器:
java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser some.sample.Class当然,您要确保指定的类存在并在类路径上。
可以用两种方法配置解析器:功能和属性。 功能包括打开或关闭特定功能,比如验证。 属性包括设置解析器所使用的特定项的值,如用来验证所有文档的模式位置。
功能是通过解析器上名为
setFeature()
的方法设置的2. 设置 SAX 解析器的功能
- // Obtain an instance of an XMLReader implementation from a system property
- XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
- String featureName = "some feature URI";
- boolean featureOn = true;
- try {
- parser.setFeature(featureName, featureOn);
- } catch (SAXNotRecognizedException e) {
- System.err.println("Unknown feature specified: " + e.getMessage());
- } catch (SAXNotSupportedException e) {
- System.err.println("Unsupported feature specified: " + e.getMessage());
- } catch (SAXException e) {
- System.err.println("Error in setting feature: " + e.getMessage());
- }
3. 一些常见功能
- // Obtain an instance of an XMLReader implementation from a system property
- XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
- try {
- // Turn on validation
- parser.setFeature("http://xml.org/sax/features/validation", true);
- // Ensure namespace processing is on (the default)
- parser.setFeature("http://xml.org/sax/features/namespaces", true);
- } catch (SAXNotRecognizedException e) {
- System.err.println("Unknown feature specified: " + e.getMessage());
- } catch (SAXNotSupportedException e) {
- System.err.println("Unsupported feature specified: " + e.getMessage());
- } catch (SAXException e) {
- System.err.println("Error in setting feature: " + e.getMessage());
- }
请注意,虽然解析器有几个标准 SAX 功能,但这些解析器可以自由地添加自己的特定于供应商的功能。例如,Apache Xerces-J 添加了一些考虑动态验证以及遇到致命错误之后继续处理的功能。请参考解析器供应商的文档,以获取相关的功能 URI。
一旦理解了功能,就很容易理解属性。除了属性将对象作为参数而功能获取布尔值外,它们以完全相同的方式操作。我们使用
setProperty()
方法来设置属性4. 设置 SAX 解析器的属性
- 1. // Obtain an instance of an XMLReader implementation from a system property
- XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
- String propertyName = "some property URI";
- try {
- parser.setProperty(propertyName, obj-arg);
- } catch (SAXNotRecognizedException e) {
- System.err.println("Unknown property specified: " + e.getMessage());
- } catch (SAXNotSupportedException e) {
- System.err.println("Unsupported property specified: " + e.getMessage());
- } catch (SAXException e) {
- System.err.println("Error in setting property: " + e.getMessage());
- }
这里使用相同的错误处理框架,所以您可以容易地在两种类型的配置选项之间复制代码。和功能一样,SAX 提供了一组标准属性,
供应商可以添加他们自己的扩展。常见的SAX 标准的属性考虑到了设置词法处理程序
(Lexical Handler)和声明处理程序(Declaration Handler)
像 Apache Xerces 之类的解析器对它们进行了扩展,例如,使它们能够设置输入缓冲区大小以及要在验证中使用的外部模式的位置。
5. 一些常见属性
- // Obtain an instance of an XMLReader implementation from a system property
- XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
- try {
- // Set the chunk to read in by SAX
- parser.setProperty("http://apache.org/xml/properties/input-buffer-size",
- new Integer(2048));
- // Set a LexicalHandler
- parser.setProperty("http://xml.org/sax/properties/lexical-handler",
- new MyLexicalHandler());
- } catch (SAXNotRecognizedException e) {
- System.err.println("Unknown feature specified: " + e.getMessage());
- } catch (SAXNotSupportedException e) {
- System.err.println("Unsupported feature specified: " + e.getMessage());
- } catch (SAXException e) {
- System.err.println("Error in setting feature: " + e.getMessage());
- }
通过理解功能和属性,您几乎可以让解析器做任何事情。