查看源代码 xmerl_sax_parser (xmerl v2.1)
XML SAX 解析器 API
一个用于 XML 的 SAX 解析器,它通过回调接口发送事件。SAX 是 XML 简单 API,最初是一个仅 Java 的 API。SAX 是 Java 中第一个被广泛采用的 XML API,并且是 事实上的 标准,在 Java 以外的几种编程语言环境中有对应的版本。
概要
类型
当解析器输入数据耗尽时调用的回调 function/0
。
为解析器发送的每个事件调用的回调 function/0
。
使用 iso-latin-1 编码的二进制数据。
用于自定义解析器行为的选项。
使用 UTF-8 或 UTF-16 编码的二进制数据。
表示有效 Unicode 代码点的整数。
类型
-type continuation_fun() :: fun((continuation_state()) -> {NewBytes :: binary() | list(), continuation_state()}).
当解析器输入数据耗尽时调用的回调 function/0
。
如果函数无法获取更多输入,则返回一个空列表或二进制数据(取决于 stream/2 中的起始输入)。其他类型的错误通过异常处理。如果 continuation 函数遇到致命错误,请使用 throw/1
发送以下元组:{Tag = atom(), Reason = string()}
。Tag
是一个标识发送异常的函数实体的原子,Reason
是一个描述问题的字符串。
-type continuation_state() :: term().
-type event() :: startDocument | endDocument | {startPrefixMapping, Prefix :: string(), Uri :: string()} | {endPrefixMapping, Prefix :: string()} | {startElement, Uri :: string(), LocalName :: string(), QualifiedName :: string(), Attributes :: string()} | {endElement, Uri :: string(), LocalName :: string(), QualifiedName :: string()} | {characters, string()} | {ignorableWhitespace, string()} | {processingInstruction, Target :: string(), Data :: string()} | {comment, string()} | startCDATA | endCDATA | {startDTD, Name :: string(), PublicId :: string(), SystemId :: string()} | endDTD | {startEntity, SysId :: string()} | {endEntity, SysId :: string()} | {elementDecl, Name :: string(), Model :: string()} | {attributeDecl, ElementName :: string(), AttributeName :: string(), Type :: string(), Mode :: string(), Value :: string()} | {internalEntityDecl, Name :: string(), Value :: string()} | {externalEntityDecl, Name :: string(), PublicId :: string(), SystemId :: string()} | {unparsedEntityDecl, Name :: string(), PublicId :: string(), SystemId :: string(), Ndata :: string()} | {notationDecl, Name :: string(), PublicId :: string(), SystemId :: string()}.
通过 事件回调 发送给用户的 SAX 事件。
startDocument
- 接收文档开始的通知。SAX 解析器仅在任何其他事件回调之前发送此事件一次。endDocument
- 接收文档结束的通知。SAX 解析器仅发送此事件一次,并且它将是解析期间的最后一个事件。{startPrefixMapping, Prefix, Uri}
- 开始前缀-URI 命名空间映射的范围。请注意,不能保证start/endPrefixMapping
事件彼此正确嵌套:所有startPrefixMapping
事件都将在相应的startElement
事件之前立即发生,并且所有endPrefixMapping
事件都将在相应的endElement
事件之后立即发生,但它们的顺序不能以其他方式保证。对于 "xml" 前缀,将没有start/endPrefixMapping
事件,因为它已预先声明且不可变。{endPrefixMapping, Prefix}
- 结束前缀-URI 映射的范围。{startElement, Uri, LocalName, QualifiedName, Attributes}
- 接收元素开始的通知。解析器将在 XML 文档中每个元素的开头发送此事件;对于每个startElement
事件,都将有一个对应的endElement
事件(即使元素为空)。在相应的endElement
事件之前,将按顺序报告元素的所有内容。{endElement, Uri, LocalName, QualifiedName}
- 接收元素结束的通知。SAX 解析器将在 XML 文档中每个元素的结尾发送此事件;对于每个endElement
事件,都将有一个对应的startElement
事件(即使元素为空)。{characters, string()}
- 接收字符数据的通知。{ignorableWhitespace, string()}
- 接收元素内容中可忽略的空白的通知。{processingInstruction, Target, Data}
- 接收处理指令的通知。解析器将为找到的每个处理指令发送此事件一次:请注意,处理指令可能出现在主文档元素之前或之后。{comment, string()}
- 报告文档中任何位置(包括文档元素内部和外部)的 XML 注释。startCDATA
- 报告 CDATA 部分的开始。CDATA 部分的内容将通过常规字符事件报告。endCDATA
- 报告 CDATA 部分的结束。{startDTD, Name, PublicId, SystemId}
- 报告 DTD 声明的开始,它报告 DOCTYPE 声明的开始。如果文档没有 DOCTYPE 声明,则不会发送此事件。endDTD
- 报告 DTD 声明的结束,它报告 DOCTYPE 声明的结束。{startEntity, SysId}
- 报告一些内部和外部 XML 实体的开始。{endEntity, SysId}
- 报告实体的结束。{elementDecl, Name, Model}
- 报告元素类型声明。内容模型将包含字符串 "EMPTY"、字符串 "ANY" 或一个带括号的组,可以选择后跟一个出现指示符。该模型将被规范化,以便所有参数实体都得到完全解析,并且所有空白都被删除,并且将包含括起它们的括号。其他规范化(例如删除冗余括号或简化出现指示符)由解析器自行决定。{attributeDecl, ElementName, AttributeName, Type, Mode, Value}
- 报告属性类型声明。{internalEntityDecl, Name, Value}
- 报告内部实体声明。{externalEntityDecl, Name, PublicId, SystemId}
- 报告已解析的外部实体声明。{unparsedEntityDecl, Name, PublicId, SystemId, Ndata}
- 接收未解析的实体声明事件的通知。{notationDecl, Name, PublicId, SystemId}
- 接收表示法声明事件的通知。
-type event_fun() :: fun((event(), event_location(), event_state()) -> event_state()).
为解析器发送的每个事件调用的回调 function/0
。
错误处理通过异常完成。如果应用程序遇到致命错误,请使用 throw/1
发送以下元组:{Tag = atom(), Reason = string()}
。Tag
是一个标识发送异常的函数实体的原子,Reason
是一个描述问题的字符串。
-type event_state() :: term().
-type latin1_binary() :: unicode:latin1_binary().
使用 iso-latin-1 编码的二进制数据。
-type options() :: [{continuation_fun, continuation_fun()} | {continuation_state, continuation_state()} | {event_fun, event_fun()} | {event_state, event_state()} | {file_type, normal | dtd} | {encoding, utf | {utf16, big} | {utf16, little} | latin1 | list} | skip_external_dtd | disallow_entities | {entity_recurse_limit, non_neg_integer()} | {external_entities, all | file | none} | {fail_undeclared_ref, boolean()}].
用于自定义解析器行为的选项。
可能的选项是
{continuation_fun, ContinuationFun}
- ContinuationFun 是一个回调函数,用于决定当解析器在文档完成之前遇到 EOF 时该做什么。{continuation_state, ContinuationState}
- 在 continuation 回调函数中可访问的状态。{event_fun, EventFun}
- EventFun 是解析器事件的回调函数。{event_state, EventState}
- 在事件回调函数中可访问的状态。{file_type, FileType}
- 一个标志,告诉解析器它正在解析 DTD 还是普通 XML 文件(默认为normal
)。{encoding, Encoding}
- 设置使用的默认字符集(默认为utf
,即 UTF-8)。仅当 XML 文档未显式给出此字符集时,才使用此字符集。skip_external_dtd
- 在解析期间跳过外部 DTD。此选项与{external_entities, none}
和{fail_undeclared_ref, false}
相同,但仅适用于 DTD。disallow_entities
- 表示如果找到 ENTITY 声明,则解析失败。{entity_recurse_limit, N}
- 设置实体允许的递归级别数。默认为 3 级。{external_entities, Allowed}
- 设置应允许哪些类型的外部实体;如果不允许,则只会跳过。默认为none
。{fail_undeclared_ref, Boolean}
- 决定当找到未声明的引用时,解析器应该如何表现。如果已关闭外部实体,以便不解析外部 DTD,则此选项可能很有用。默认为true
。
-type unicode_binary() :: binary().
使用 UTF-8 或 UTF-16 编码的二进制数据。
-type unicode_char() :: char().
表示有效 Unicode 代码点的整数。
函数
-spec file(Name, Options) -> {ok, EventState, Rest} | ErrorOrUserReturn when Name :: file:filename(), Options :: options(), EventState :: event_state(), Rest :: unicode_binary() | latin1_binary(), ErrorOrUserReturn :: {Tag, Location, Reason, EndTags, EventState} | {error, {Name, Reason}}, Tag :: fatal_error | atom(), Location :: event_location(), Reason :: term(), EndTags :: term().
解析包含 XML 文档的文件。
此函数使用默认的 continuation 函数以块方式读取文件。
-spec stream(Xml, Options) -> {ok, EventState, Rest} | ErrorOrUserReturn when Xml :: unicode_binary() | latin1_binary() | [unicode_char], Options :: options(), EventState :: event_state(), Rest :: unicode_binary() | latin1_binary(), ErrorOrUserReturn :: {Tag, Location, Reason, EndTags, EventState}, Tag :: fatal_error | atom(), Location :: event_location(), Reason :: term(), EndTags :: term().
解析包含 XML 文档的流。