public interface XMLReader
用于使用回调读取 XML 文档的接口。
此模块(包括源代码和文档)在公共域中,同时 没有担保。有关更多信息,请参阅 http://www.saxproject.org。
注:不管其名称如何,此接口不 扩展标准的 Java Reader
接口,因为读取 XML 是一个与读取字符数据完全不同的活动。
XMLReader 是 XML 解析器的 SAX2 驱动程序必须实现的接口。此接口允许应用程序设置和查询解析器中的功能和属性,注册文档处理的事件处理程序,以及开始文档解析。
所有的 SAX 接口都假定为是同步的:必须在完成分解后返回 parse
方法,并且阅读器必须等待事件处理程序回调返回后才能报告下一个事件。
此接口取代了(现在不推荐) SAX 1.0 Parser
接口。与旧的解析器接口(和某些监控器接口)相比,XMLReader 接口具有两大重要增强:
存在将 SAX1 解析器转换为 SAX2 XMLReader 的适配器并且反之亦然。
XMLFilter
,
ParserAdapter
,
XMLReaderAdapter
方法摘要 | |
---|---|
ContentHandler |
getContentHandler() 返回当前的内容处理程序。 |
DTDHandler |
getDTDHandler() 返回当前的 DTD 处理程序。 |
EntityResolver |
getEntityResolver() 返回当前的实体解析器。 |
ErrorHandler |
getErrorHandler() 返回当前的错误处理程序。 |
boolean |
getFeature(String name) 查找功能标志的值。 |
Object |
getProperty(String name) 查找属性的值。 |
void |
parse(InputSource input) 解析 XML 文档。 |
void |
parse(String systemId) 从系统标识符 (URI) 解析 XML 文档。 |
void |
setContentHandler(ContentHandler handler) 允许应用程序注册内容事件处理程序。 |
void |
setDTDHandler(DTDHandler handler) 允许应用程序注册 DTD 事件处理程序。 |
void |
setEntityResolver(EntityResolver resolver) 允许应用程序注册实体解析器。 |
void |
setErrorHandler(ErrorHandler handler) 允许应用程序注册错误事件处理程序。 |
void |
setFeature(String name, boolean value) 设置功能标志的值。 |
void |
setProperty(String name, Object value) 设置属性的值。 |
方法详细信息 |
---|
boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException
功能名称是任何完全限定 URI。XMLReader 识别功能名称是可能的,但暂时不能返回它的值。有些功能值仅在特定的上下文中可用,例如在解析之前、期间或之后。另外,有些功能值不能以编程方式访问。(如果是用于 SAX1 Parser
的适配器,则将没有独立于实现的方法来公开基础解析器是否在执行验证,是否展开外部实体等。)
要求所有的 XMLReaders 都能识别 http://xml.org/sax/features/namespaces 和 http://xml.org/sax/features/namespace-prefixes 功能名称。
典型用途如下:
XMLReader r = new MySAXDriver(); // try to activate validation try { r.setFeature("http://xml.org/sax/features/validation", true); } catch (SAXException e) { System.err.println("Cannot activate validation."); } // register event handlers r.setContentHandler(new MyContentHandler()); r.setErrorHandler(new MyErrorHandler()); // parse the first document try { r.parse("http://www.foo.com/mydoc.xml"); } catch (IOException e) { System.err.println("I/O exception reading XML document"); } catch (SAXException e) { System.err.println("XML exception reading document."); }
通过使用在其自己的 URI 上构建的名称,实现可以随意(建议)设计其自己的功能。
name
- 功能名称,它是一个完全限定 URI。
SAXNotRecognizedException
- 如果功能值不能分配或检索。
SAXNotSupportedException
- 当 XMLReader 能够识别功能名称但此时却无法确定其值时。
setFeature(java.lang.String, boolean)
void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException
功能名称是任何完全限定 URI。XMLReader 可以公开功能值,但却无法改变当前值。有些功能值仅在特定的上下文中不可改变或可以改变,例如在解析之前、期间或之后。
要求所有的 XMLReaders 支持把 http://xml.org/sax/features/namespaces 设置为 true,把 http://xml.org/sax/features/namespace-prefixes 设置为 false。
name
- 功能名称,它是一个完全限定 URI。
value
- 请求的功能值(true 或 false)。
SAXNotRecognizedException
- 如果功能值不能分配或检索。
SAXNotSupportedException
- 当 XMLReader 能够识别功能名称但不能设置请求的值时。
getFeature(java.lang.String)
Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException
属性名称是任何完全限定 URI。XMLReader 可以识别属性名称,但暂时不能返回其值。有些属性值仅在特定的上下文中可用,例如在解析之前、期间或之后。
不要求 XMLReaders 能够识别任何特定的属性名称,但要记录 SAX2 的初始核心集。
使用在其自己的 URI 上构建的名称,实现可以随意(并且推荐)设计其自己的属性。
name
- 属性名称,它是一个完全限定 URI。
SAXNotRecognizedException
- 如果属性值不能分配或检索。
SAXNotSupportedException
- 当 XMLReader 能够识别属性名称但此时却不能确定其值时。
setProperty(java.lang.String, java.lang.Object)
void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException
属性名称是任何完全限定 URI。XMLReader 可以识别属性名称,但却不能改变当前值。有些属性值仅在特定的上下文中不可改变或可以改变,例如在解析之前、期间或之后。
不要求 XMLReaders 知道设置任何特定的属性名称,尽管 SAX2 定义了核心集。
此方法还是用于设置扩展的处理程序的标准机制。
name
- 属性名称,它是一个完全限定 URI。
value
- 请求的属性值。
SAXNotRecognizedException
- 如果属性值不能分配或检索。
SAXNotSupportedException
- 当 XMLReader 能够识别属性名称但却不能设置请求的值时。
void setEntityResolver(EntityResolver resolver)
如果应用程序不注册实体解析器,则 XMLReader 将执行其自己默认的解析。
应用程序还可以在解析期间注册新的或不同的解析器,并且 SAX 解析器必须立即开始使用新的解析器。
resolver
- 实体解析器。
getEntityResolver()
EntityResolver getEntityResolver()
setEntityResolver(org.xml.sax.EntityResolver)
void setDTDHandler(DTDHandler handler)
如果应用程序不注册 DTD 处理程序,则将默默地忽略由 SAX 解析器报告的所有 DTD 事件。
应用程序还可以在解析期间注册新的或不同的处理程序,并且 SAX 解析器必须立即开始使用新的处理程序。
handler
- DTD 处理程序。
getDTDHandler()
DTDHandler getDTDHandler()
setDTDHandler(org.xml.sax.DTDHandler)
void setContentHandler(ContentHandler handler)
如果应用程序不注册内容处理程序,则将默默地忽略由 SAX 解析器报告的所有内容事件。
应用程序还可以在解析期间注册新的或不同的处理程序,并且 SAX 解析器必须立即开始使用新的处理程序。
handler
- 内容处理程序。
getContentHandler()
ContentHandler getContentHandler()
setContentHandler(org.xml.sax.ContentHandler)
void setErrorHandler(ErrorHandler handler)
如果应用程序不注册错误处理程序,则将默默地忽略由 SAX 解析器报告的所有错误事件;但是不能继续进行常规处理。强烈建议所有的 SAX 应用程序实现错误处理程序,以避免出现不可预料的故障。
应用程序还可以在解析期间注册新的或不同的处理程序,并且 SAX 解析器必须立即开始使用新的处理程序。
handler
- 错误处理程序。
getErrorHandler()
ErrorHandler getErrorHandler()
setErrorHandler(org.xml.sax.ErrorHandler)
void parse(InputSource input) throws IOException, SAXException
应用程序可以使用此方法指导 XML reader 开始解析来自任何有效输入源(字符流、字节流或 URI)的 XML 文档。
在解析正在进行时,应用程序不能调用此方法(它们必须为每个嵌套的 XML 文档创建新的 XMLReader)。一旦完成了解析,应用程序就可以重新使用同一个 XMLReader 对象(可能带有不同的输入源)。在完成解析之前对 XMLReader 对象的配置(例如为功能标记和属性建立的处理程序绑定和值)是不可改变的,除非配置在此方面的定义显式指定了其他行为。(例如,公开被解析的文档的特征的功能标记或属性。)
在解析期间,XMLReader 通过已注册的事件处理程序提供关于 XML 文档的信息。
此方法是同步的:它直到解析结束后才返回。如果客户端应用程序希望提前终止解析,则它应该抛出一个异常。
input
- XML 文档的顶层的输入源。
SAXException
- 任何 SAX 异常,可能包装另外的异常。
IOException
- 解析器发出的 IO 异常,可能来自应用程序提供的字节流或字符流。
InputSource
,
parse(java.lang.String)
,
setEntityResolver(org.xml.sax.EntityResolver)
,
setDTDHandler(org.xml.sax.DTDHandler)
,
setContentHandler(org.xml.sax.ContentHandler)
,
setErrorHandler(org.xml.sax.ErrorHandler)
void parse(String systemId) throws IOException, SAXException
此方法是从系统标识符读取文档这一常见情形的捷径。它完全等效于以下方法:
parse(new InputSource(systemId));
如果系统标识符是 URL,则在将它传递到解析器之前必须由应用程序对它进行完整的解析。
systemId
- 系统标识符 (URI)。
SAXException
- 任何 SAX 异常,可能包装另外的异常。
IOException
- 解析器发出的 IO 异常,可能来自应用程序提供的字节流或字符流。
parse(org.xml.sax.InputSource)