public interface ContentHandler
org.xml.sax.ContentHandler |
Known Indirect Subclasses |
接收文档逻辑内容的通知。
This module, both source code and documentation, is in the Public Domain, and comes with NO WARRANTY. See http://www.saxproject.org for further information.
这是大多数SAX应用程序实现的主要接口:如果应用程序需要被告知基本解析事件,它将实现此接口并使用setContentHandler
方法向SAX解析器注册一个实例。 解析器使用实例来报告基本的文档相关事件,如元素的开始和结束以及字符数据。
该界面中的事件顺序非常重要,并反映文档本身的信息顺序。 例如,所有元素的内容(字符数据,处理指令和/或子元素)将按照startElement事件和相应的endElement事件之间的顺序出现。
该接口与现在不赞成使用的SAX 1.0 DocumentHandler接口类似,但它增加了对名称空间的支持和用于报告跳过的实体(在非验证XML处理器中)的支持。
实现者应该注意, java.net
包中还有一个ContentHandler
类; 这意味着这可能是一个糟糕的主意
import java.net.*; import org.xml.sax.*;
事实上,“import ... *”通常都是一种拙劣编程的标志,因此用户应该将其视为一个功能而不是bug。
也可以看看:
Public methods |
|
---|---|
abstract void |
characters(char[] ch, int start, int length) 接收字符数据的通知。 |
abstract void |
endDocument() 接收文档结束的通知。 |
abstract void |
endElement(String uri, String localName, String qName) 接收元素结束的通知。 |
abstract void |
endPrefixMapping(String prefix) 结束前缀-URI映射的范围。 |
abstract void |
ignorableWhitespace(char[] ch, int start, int length) 接收元素内容中可忽略空白的通知。 |
abstract void |
processingInstruction(String target, String data) 接收处理指令的通知。 |
abstract void |
setDocumentLocator(Locator locator) 接收一个对象以查找SAX文档事件的来源。 |
abstract void |
skippedEntity(String name) 接收跳过实体的通知。 |
abstract void |
startDocument() 接收文档开始的通知。 |
abstract void |
startElement(String uri, String localName, String qName, Attributes atts) 接收元素开始的通知。 |
abstract void |
startPrefixMapping(String prefix, String uri) 开始前缀-URI命名空间映射的范围。 |
void characters (char[] ch, int start, int length)
接收字符数据的通知。
解析器将调用此方法来报告每个字符数据块。 SAX解析器可能会将所有连续的字符数据返回到单个块中,或者它们可能会将其分割为多个块; 但是,任何单个事件中的所有字符必须来自相同的外部实体,以便定位器提供有用的信息。
应用程序不能尝试从指定范围之外的数组读取数据。
单个字符可能包含多个Java char
值。 发生这种情况有两种重要的情况,因为字符不能用十六位表示。 在一种情况下,字符在代理对中表示,使用两个特殊的Unicode值。 这些字符位于所谓的“星体飞机”中,代码点高于U + FFFF。 第二种情况涉及复合字符,例如与一个或多个重音字符组合的基本字符。
你的代码不应该假定使用char
- char
-a-time成语的算法将以字符单位工作; 在某些情况下,他们会分割字符。 在XML允许任意字符(如属性值,处理指令数据和注释)以及从该方法报告的数据中,这是相关的。 每当Java代码操纵国际化文本时,它也通常相关; 这个问题不是XML所特有的。
请注意,一些解析器将使用 ignorableWhitespace
方法而不是这个方法报告元素内容中的空白(验证解析器 必须这样做)。
Parameters | |
---|---|
ch |
char : the characters from the XML document |
start |
int : the start position in the array |
length |
int : the number of characters to read from the array |
Throws | |
---|---|
SAXException |
any SAX exception, possibly wrapping another exception |
void endDocument ()
接收文档结束的通知。
该方法的文档与fatalError(SAXParseException)
的文档之间存在明显的矛盾。 在未来的主要版本中解决这个歧义之前,客户端应该不会假设在解析器报告fatalError()或引发异常时endDocument()是否会被调用。
SAX解析器只会调用一次该方法,它将是解析过程中调用的最后一个方法。 解析器不应该调用此方法,直到它放弃解析(由于错误不可恢复)或到达输入的结尾。
Throws | |
---|---|
SAXException |
any SAX exception, possibly wrapping another exception |
也可以看看:
void endElement (String uri, String localName, String qName)
接收元素结束的通知。
SAX解析器将在XML文档中的每个元素的末尾调用此方法; 每个endElement事件都会有相应的startElement
事件(即使元素为空)。
有关名称的信息,请参阅startElement。
Parameters | |
---|---|
uri |
String : the Namespace URI, or the empty string if the element has no Namespace URI or if Namespace processing is not being performed |
localName |
String : the local name (without prefix), or the empty string if Namespace processing is not being performed |
qName |
String : the qualified XML name (with prefix), or the empty string if qualified names are not available |
Throws | |
---|---|
SAXException |
any SAX exception, possibly wrapping another exception |
void endPrefixMapping (String prefix)
结束前缀-URI映射的范围。
详情请参阅startPrefixMapping
。 这些事件将会立即发生,相应的后endElement
事件,但顺序endPrefixMapping
事件是不是另有保证。
Parameters | |
---|---|
prefix |
String : the prefix that was being mapped. This is the empty string when a default mapping scope ends. |
Throws | |
---|---|
SAXException |
the client may throw an exception during processing |
void ignorableWhitespace (char[] ch, int start, int length)
接收元素内容中可忽略空白的通知。
验证解析器必须使用此方法报告元素内容中的每个空白块(请参阅W3C XML 1.0建议的第2.10节):如果非验证解析器能够解析和使用内容模型,则也可以使用此方法。
SAX解析器可能会将单个块中的所有连续空白值返回,或者可能会将其分割为多个块; 但是,任何单个事件中的所有字符必须来自相同的外部实体,以便定位器提供有用的信息。
应用程序不能尝试从指定范围之外的数组读取数据。
Parameters | |
---|---|
ch |
char : the characters from the XML document |
start |
int : the start position in the array |
length |
int : the number of characters to read from the array |
Throws | |
---|---|
SAXException |
any SAX exception, possibly wrapping another exception |
也可以看看:
void processingInstruction (String target, String data)
接收处理指令的通知。
解析器将为找到的每个处理指令调用一次该方法:请注意,处理指令可能发生在主文档元素之前或之后。
SAX解析器不得使用此方法报告XML声明(XML 1.0,第2.8节)或文本声明(XML 1.0,第4.3.1节)。
像 characters()
一样,处理指令数据可能具有需要多个 char
值的字符。
Parameters | |
---|---|
target |
String : the processing instruction target |
data |
String : the processing instruction data, or null if none was supplied. The data does not include any whitespace separating it from the target |
Throws | |
---|---|
SAXException |
any SAX exception, possibly wrapping another exception |
void setDocumentLocator (Locator locator)
接收一个对象以查找SAX文档事件的来源。
SAX解析器强烈建议(尽管不是绝对必需)提供定位器:如果这样做,它必须在调用ContentHandler接口中的任何其他方法之前通过调用此方法将定位器提供给应用程序。
定位器允许应用程序确定任何文档相关事件的结束位置,即使解析器未报告错误。 通常情况下,应用程序将使用此信息报告自己的错误(例如与应用程序业务规则不匹配的字符内容)。 由定位器返回的信息可能不足以用于搜索引擎。
请注意,只有在调用SAX事件回调期间, startDocument
返回之后和endDocument
之前,定位器才会返回正确的信息。 应用程序不应该尝试在任何其他时间使用它。
Parameters | |
---|---|
locator |
Locator : an object that can return the location of any SAX document event |
也可以看看:
void skippedEntity (String name)
接收跳过实体的通知。 这不是为标记结构中的实体引用调用的,例如元素开始标记或标记声明。 (XML建议要求报告跳过的外部实体,除标记结构内外,SAX还报告内部实体扩展/非扩展。)
每次实体被跳过时,解析器都会调用这个方法。 未验证的处理器可能会在实体没有看到声明时跳过实体(例如,因为实体是在外部DTD子集中声明的)。 所有处理器可能跳过外部实体,具体取决于http://xml.org/sax/features/external-general-entities
和http://xml.org/sax/features/external-parameter-entities
属性的值。
Parameters | |
---|---|
name |
String : the name of the skipped entity. If it is a parameter entity, the name will begin with '%', and if it is the external DTD subset, it will be the string "[dtd]" |
Throws | |
---|---|
SAXException |
any SAX exception, possibly wrapping another exception |
void startDocument ()
接收文档开始的通知。
SAX解析器只会在任何其他事件回调( setDocumentLocator
除外)之前调用此方法一次。
Throws | |
---|---|
SAXException |
any SAX exception, possibly wrapping another exception |
也可以看看:
void startElement (String uri, String localName, String qName, Attributes atts)
接收元素开始的通知。
解析器将在XML文档的每个元素的开始处调用此方法; 每个startElement事件都会有相应的endElement
事件(即使元素为空)。 所有元素的内容将依次在相应的endElement事件之前报告。
此事件允许每个元素最多包含三个名称组件:
根据 http://xml.org/sax/features/namespaces和 http://xml.org/sax/features/namespace-prefixes属性的值,可以提供任何或全部这些内容:
请注意,提供的属性列表将仅包含具有显式值(指定或默认值)的属性:#IMPLIED属性将被省略。 仅当http://xml.org/sax/features/namespace-prefixes
属性为true(默认情况下为false,并且对真值的支持为可选)时,属性列表将包含用于名称空间声明(xmlns *属性)的属性。
像 characters()
一样,属性值可能具有需要多个 char
值的字符。
Parameters | |
---|---|
uri |
String : the Namespace URI, or the empty string if the element has no Namespace URI or if Namespace processing is not being performed |
localName |
String : the local name (without prefix), or the empty string if Namespace processing is not being performed |
qName |
String : the qualified name (with prefix), or the empty string if qualified names are not available |
atts |
Attributes : the attributes attached to the element. If there are no attributes, it shall be an empty Attributes object. The value of this object after startElement returns is undefined |
Throws | |
---|---|
SAXException |
any SAX exception, possibly wrapping another exception |
void startPrefixMapping (String prefix, String uri)
开始前缀-URI命名空间映射的范围。
来自此事件的信息对于正常的命名空间处理不是必需的:当 http://xml.org/sax/features/namespaces
功能为 真 (默认)时,SAX XML阅读器将自动替换元素和属性名称的前缀。
然而,有些情况下,当应用程序需要在字符数据或属性值中使用前缀时,它们无法安全地自动扩展; 如有必要,start / endPrefixMapping事件将信息提供给应用程序以在这些上下文中自行扩展前缀。
请注意,不保证start / endPrefixMapping事件相对于彼此正确嵌套:所有startPrefixMapping事件将紧接在相应的 startElement
事件之前发生,并且所有 endPrefixMapping
事件将紧接在相应的 endElement
事件之后发生,但是它们的顺序没有另外的保证。
不应该有“xml”前缀的start / endPrefixMapping事件,因为它是预先声明且不可变的。
Parameters | |
---|---|
prefix |
String : the Namespace prefix being declared. An empty string is used for the default element namespace, which has no prefix. |
uri |
String : the Namespace URI the prefix is mapped to |
Throws | |
---|---|
SAXException |
the client may throw an exception during processing |