查看源代码 xmerl_sax_parser (xmerl v2.1)

XML SAX 解析器 API

一个用于 XML 的 SAX 解析器,它通过回调接口发送事件。SAX 是 XML 简单 API,最初是一个仅 Java 的 API。SAX 是 Java 中第一个被广泛采用的 XML API,并且是 事实上的 标准,在 Java 以外的几种编程语言环境中有对应的版本。

概要

类型

当解析器输入数据耗尽时调用的回调 function/0

通过 事件回调 发送给用户的 SAX 事件。

为解析器发送的每个事件调用的回调 function/0

使用 iso-latin-1 编码的二进制数据。

用于自定义解析器行为的选项。

使用 UTF-8 或 UTF-16 编码的二进制数据。

表示有效 Unicode 代码点的整数。

函数

解析包含 XML 文档的文件。

解析包含 XML 文档的流。

类型

链接到此类型

continuation_fun()

查看源代码 (未导出)
-type continuation_fun() ::
          fun((continuation_state()) -> {NewBytes :: binary() | list(), continuation_state()}).

当解析器输入数据耗尽时调用的回调 function/0

如果函数无法获取更多输入,则返回一个空列表或二进制数据(取决于 stream/2 中的起始输入)。其他类型的错误通过异常处理。如果 continuation 函数遇到致命错误,请使用 throw/1 发送以下元组:{Tag = atom(), Reason = string()}Tag 是一个标识发送异常的函数实体的原子,Reason 是一个描述问题的字符串。

链接到此类型

continuation_state()

查看源代码 (未导出)
-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 是一个描述问题的字符串。

链接到此类型

event_location()

查看源代码 (未导出)
-type event_location() :: {CurrentLocation :: string(), Entityname :: string(), LineNo :: integer()}.
链接到此类型

event_state()

查看源代码 (未导出)
-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 文档的流。