- 所有已知的子接口:
TemplatesHandler
,TransformerHandler
- 所有已知的实现类:
DefaultHandler
,DefaultHandler2
,ValidatorHandler
,XMLFilterImpl
,XMLReaderAdapter
这是大多数 SAX 应用程序实现的主要接口:如果应用程序需要被告知基本的解析事件,它会实现这个接口并使用 setContentHandler
方法向 SAX 解析器注册一个实例。解析器使用该实例来报告基本的文档相关事件,例如元素和字符数据的开始和结束。
此界面中的事件顺序非常重要,它反映了文档本身中信息的顺序。例如,元素的所有内容(字符数据、处理指令和/或子元素)将按顺序出现在 startElement 事件和相应的 endElement 事件之间。
该接口类似于现已弃用的 SAX 1.0 DocumentHandler 接口,但它增加了对命名空间和报告跳过实体的支持(在非验证 XML 处理器中)。
实施者应注意,java.net
包中还有一个 ContentHandler
类;这意味着这可能不是一个好主意
import java.net.*; import org.xml.sax.*;
事实上,“import ...*”通常是草率编程的标志,所以用户应该将此视为一个特性而不是一个错误。
- 自从:
- 1.4, SAX 2.0
- 参见:
-
方法总结
修饰符和类型方法描述void
characters
(char[] ch, int start, int length) 接收字符数据通知。default void
declaration
(String version, String encoding, String standalone) 接收 XML 声明的通知。void
接收文档结束通知。void
endElement
(String uri, String localName, String qName) 接收元素结束的通知。void
endPrefixMapping
(String prefix) 结束前缀 URI 映射的范围。void
ignorableWhitespace
(char[] ch, int start, int length) 接收元素内容中可忽略空格的通知。void
processingInstruction
(String target, String data) 接收处理指令的通知。void
setDocumentLocator
(Locator locator) 接收用于定位 SAX 文档事件来源的对象。void
skippedEntity
(String name) 接收已跳过实体的通知。void
接收文档开始的通知。void
startElement
(String uri, String localName, String qName, Attributes atts) 接收元素开始的通知。void
startPrefixMapping
(String prefix, String uri) 开始前缀 URI 命名空间映射的范围。
-
方法详情
-
setDocumentLocator
接收用于定位 SAX 文档事件来源的对象。强烈鼓励 SAX 解析器(虽然不是绝对要求)提供定位器:如果这样做,它必须在调用 ContentHandler 接口中的任何其他方法之前通过调用此方法向应用程序提供定位器。
定位器允许应用程序确定任何文档相关事件的结束位置,即使解析器没有报告错误。通常,应用程序会使用此信息来报告自己的错误(例如字符内容与应用程序的业务规则不匹配)。定位器返回的信息可能不足以用于搜索引擎。
请注意,定位器将仅在
startDocument
返回之后和endDocument
被调用之前的调用 SAX 事件回调期间返回正确的信息。应用程序不应在任何其他时间尝试使用它。- 参数:
locator
- 可以返回任何 SAX 文档事件位置的对象- 参见:
-
startDocument
接收文档开始的通知。SAX 解析器将仅在任何其他事件回调(
setDocumentLocator
除外)之前调用此方法一次。- 抛出:
SAXException
- 任何 SAX 异常,可能包装另一个异常- 参见:
-
declaration
接收 XML 声明的通知。- 实现要求:
- SAX API 中的默认实现是什么都不做。
- 参数:
version
- 输入文档中的版本字符串,如果未指定则为 nullencoding
- 输入文档中的编码字符串,如果未指定则为 nullstandalone
- 输入文档中的独立字符串,如果未指定则为 null- 抛出:
SAXException
- 如果应用程序要报告错误或中断解析过程- 自从:
- 14
-
endDocument
接收文档结束通知。在成功完成解析过程后,解析器调用此方法来发出它已到达文档末尾的信号。事件发生后,解析器会将控制权返回给应用程序。
- API 注意:
-
如果出现致命错误,解析器可能会选择使用
SAXException
停止解析过程,在这种情况下,永远不会调用此方法。请参阅ErrorHandler.fatalError(org.xml.sax.SAXParseException)
。 - 抛出:
SAXException
- 任何 SAX 异常,可能包装另一个异常- 参见:
-
startPrefixMapping
开始前缀 URI 命名空间映射的范围。来自此事件的信息对于正常的命名空间处理不是必需的:SAX XML 阅读器将在
http://xml.org/sax/features/namespaces
特性是时自动替换元素和属性名称的前缀true(默认值)。然而,在某些情况下,当应用程序需要在字符数据或属性值中使用前缀时,它们无法安全地自动扩展; start/endPrefixMapping 事件向应用程序提供信息,以在必要时扩展这些上下文中的前缀。
请注意,start/endPrefixMapping 事件不能保证相对于彼此正确嵌套:所有 startPrefixMapping 事件将在相应的
startElement
事件之前立即发生,并且所有endPrefixMapping
事件将在相应的endElement
事件之后立即发生,但不能保证它们的顺序.“xml”前缀永远不应该有 start/endPrefixMapping 事件,因为它是预先声明的并且是不可变的。
- 参数:
prefix
- 正在声明的命名空间前缀。空字符串用于没有前缀的默认元素命名空间。uri
- 前缀映射到的命名空间 URI- 抛出:
SAXException
- 客户端可能在处理过程中抛出异常- 参见:
-
endPrefixMapping
结束前缀 URI 映射的范围。有关详细信息,请参阅
startPrefixMapping
。这些事件将始终在相应的endElement
事件之后立即发生,但不保证endPrefixMapping
事件的顺序。- 参数:
prefix
- 被映射的前缀。当默认映射范围结束时,这是空字符串。- 抛出:
SAXException
- 客户端可能在处理过程中抛出异常- 参见:
-
startElement
接收元素开始的通知。解析器将在 XML 文档中的每个元素的开头调用此方法;每个 startElement 事件都会有一个相应的
endElement
事件(即使元素为空)。在相应的 endElement 事件之前,将按顺序报告所有元素的内容。此事件允许每个元素最多三个名称组件:
- 命名空间 URI;
- 本地名称;和
- 限定(前缀)名称。
可以提供任何或所有这些,具体取决于http://xml.org/sax/features/namespaces和http://xml.org/sax/features/namespace-prefixes特性:
- 当命名空间属性是时,需要命名空间 URI 和本地名称true(默认值),并且在命名空间属性为false(如果指定一个,则两者都必须);
- 当命名空间前缀属性为true,并且在命名空间前缀属性为false(默认值)。
请注意,提供的属性列表将仅包含具有显式值(指定或默认)的属性:#IMPLIED 属性将被省略。仅当
http://xml.org/sax/features/namespace-prefixes
属性为真时,属性列表将包含用于命名空间声明的属性(xmlns* 属性)(默认情况下为假,对真值的支持是可选的)。与
characters()
一样,属性值可能包含需要多个char
值的字符。- 参数:
uri
- 命名空间 URI,如果元素没有命名空间 URI 或者未执行命名空间处理,则为空字符串localName
- 本地名称(无前缀),如果未执行命名空间处理,则为空字符串qName
- 限定名称(带前缀),如果限定名称不可用,则为空字符串atts
- 附加到元素的属性。如果没有属性,则它应该是一个空的 Attributes 对象。 startElement返回后这个对象的值未定义- 抛出:
SAXException
- 任何 SAX 异常,可能包装另一个异常- 参见:
-
endElement
接收元素结束的通知。SAX 解析器将在 XML 文档中每个元素的末尾调用此方法;每个 endElement 事件都会有一个相应的
startElement
事件(即使元素为空)。有关名称的信息,请参阅 startElement。
- 参数:
uri
- 命名空间 URI,如果元素没有命名空间 URI 或者未执行命名空间处理,则为空字符串localName
- 本地名称(无前缀),如果未执行命名空间处理,则为空字符串qName
- 限定的 XML 名称(带前缀),如果限定名称不可用,则为空字符串- 抛出:
SAXException
- 任何 SAX 异常,可能包装另一个异常
-
characters
接收字符数据通知。解析器将调用此方法来报告每个字符数据块。 SAX 解析器可能会在单个块中返回所有连续的字符数据,或者它们可能会将其分成几个块;但是,任何单个事件中的所有角色都必须来自同一个外部实体,以便定位器提供有用的信息。
应用程序不得尝试读取指定范围之外的数组。
单个字符可能包含多个 Java
char
值。有两种重要的情况会发生这种情况,因为字符不能仅用 16 位来表示。在一种情况下,字符在 Surrogate Pair 中表示,使用两个特殊的 Unicode 值。这些字符在所谓的“星界平面”中,代码点在 U+FFFF 之上。第二种情况涉及复合字符,例如与一个或多个重音字符组合的基本字符。您的代码不应假设使用
char
一次习语的算法将以字符为单位工作;在某些情况下,它们会拆分字符。这在任何 XML 允许任意字符的地方都是相关的,例如属性值、处理指令数据和注释以及从此方法报告的数据中。每当 Java 代码操纵国际化文本时,它通常也是相关的;这个问题不是 XML 独有的。请注意,某些解析器将使用
ignorableWhitespace
方法而不是此方法报告元素内容中的空格(验证解析器 must 会这样做)。- 参数:
ch
- 来自 XML 文档的字符start
- 数组中的起始位置length
- 要从数组中读取的字符数- 抛出:
SAXException
- 任何 SAX 异常,可能包装另一个异常- 参见:
-
ignorableWhitespace
接收元素内容中可忽略空格的通知。验证解析器必须使用此方法来报告元素内容中的每个空白块(请参阅 W3C XML 1.0 推荐,第 2.10 节):如果非验证解析器能够解析和使用内容模型,则它们也可以使用此方法。
SAX 解析器可能会在单个块中返回所有连续的空白,或者它们可能会将其分成几个块;但是,任何单个事件中的所有角色都必须来自同一个外部实体,以便定位器提供有用的信息。
应用程序不得尝试读取指定范围之外的数组。
- 参数:
ch
- 来自 XML 文档的字符start
- 数组中的起始位置length
- 要从数组中读取的字符数- 抛出:
SAXException
- 任何 SAX 异常,可能包装另一个异常- 参见:
-
processingInstruction
接收处理指令的通知。解析器将为找到的每个处理指令调用此方法一次:请注意,处理指令可能出现在主文档元素之前或之后。
SAX 解析器绝不能使用此方法报告 XML 声明(XML 1.0,第 2.8 节)或文本声明(XML 1.0,第 4.3.1 节)。
与
characters()
一样,处理指令数据可能包含需要多个char
值的字符。- 参数:
target
- 处理指令目标data
- 处理指令数据,如果未提供则为 null。数据不包含任何将其与目标分隔开的空格- 抛出:
SAXException
- 任何 SAX 异常,可能包装另一个异常
-
skippedEntity
接收已跳过实体的通知。对于标记构造中的实体引用(例如元素开始标记或标记声明),不会调用此方法。 (XML 建议要求报告跳过的外部实体。SAX 还报告内部实体扩展/非扩展,标记结构内除外。)每次跳过实体时,解析器都会调用此方法。如果非验证处理器没有看到声明(因为,例如,实体是在外部 DTD 子集中声明的),它们可能会跳过实体。所有处理器都可以跳过外部实体,具体取决于
http://xml.org/sax/features/external-general-entities
和http://xml.org/sax/features/external-parameter-entities
属性的值。- 参数:
name
- 跳过的实体的名称。如果是参数实体,名称将以'%'开头,如果是外部DTD子集,则为字符串“[dtd]”- 抛出:
SAXException
- 任何 SAX 异常,可能包装另一个异常
-