萨克斯
XML 的 sax 风格的非验证分解器 .
萨克斯是叉子 萨克斯 1.2.4. 均提及 项目文件中的sax是指sax 1.2.4.
设计与 节点 记住,但应该做得很好 浏览器或其他常见JS执行.
Saxes不支持年龄大于10的节点版本.
与萨克斯的显著区别.
-
在XML方面,萨克斯要比萨克斯严格得多 形而上学 萨克斯即使在所谓的"严格模式"中也不严格. 这个 默默地接受不完善的XML结构. 需要的项目 更好地遵守良好结构的限制,不能使用萨克斯作为现实.
因此,萨克斯不支持HTML,或伪XML,或坏XML. 撒克逊 在所有这些案件中,都会报告成型良好的错误,但不会试图 从错误的文档中提取数据,就像sax所做的那样.
-
撒克萨斯比撒克萨斯快得多,这主要是因为大幅重新设计 内部解析逻辑。 速度的提高不仅仅是因为 删除 Sax 支持的特性。 有点帮助,但萨克斯 增加一些昂贵的检查,以便符合XML 规格。 重新设计解析逻辑是大多数 业绩改进.
-
Saxes并非旨在支持过时的平台. 我们不会污染 源或默认构建,支持已过时的平台。 如果你想的话 支持 IE 11,欢迎您制作一个增加 新建筑 转至ES5.
-
Saxes处理错误与Sax不同: 它提供了默认的偏差 处理者投出。 你可以用你自己的处理器来代替它 若为 你的操作员什么都不做,没有
resume调用方法. -
没有
StreamAPI (英语). 稍后可能会推出经过修改的API. (还是) 一个一般意义上的"流派解析器",即写字符流到 ) (中文(简体) -
撒克逊没有限制数据块的大小的设施 事件处理器。 详见FAQ条目.
遵约
萨克斯支持:
- XML 1.0 第5版
- XML 1.1 第二版
- XML 1.0 中的命名空间( 第三版)。 。 。 .
- XML 1. 1 中的命名空间( 第二版)。 。 。 .
限制
这是一个不验证的解析器,所以它只验证文档是否 身材不错 我们确实想引起所有错误的构造 遇到。 然而,这个解析器并没有对以下内容进行解析: (原始内容存档于2018-10-21). DTDs. 所以大多数错误都是错误造成的 数字化 无法是 报告.
关于 <!DOCTYPE 财务报告和审定财务报表 <!ENTITY
解析器将在文本节点和属性中处理基本的 XML 实体
值 : & < > ' "。可以定义额外的
在 XML 中,将它们放入 DTD 。 这个解剖师什么也不做
那个 如果你想听的话 doctype 事件,然后获取
文档类型,并读取实体并添加到 parser.ENTITIES成为我的
来宾.
文档
源代码包含JSDOC的评论. 使用它们。 下面是简报 现有资料摘要。 最后权威是源代码.
注意什么是公众和什么是私人.
向TypeScript的移动使得现在一切正式成为私有, 保护,或公开.
如果你用什么非公开的, 那会危及你自己.
如果文件有错误,就提出问题. 如果你只是假设, 你可能猜错了.
使用信息摘要
示例
var saxes = require("./lib/saxes"),
parser = new saxes.SaxesParser();
parser.on("error", function (e) {
// an error happened.
});
parser.on("text", function (t) {
// got some text. t is the string of text.
});
parser.on("opentag", function (node) {
// opened a tag. node has "name" and "attributes"
});
parser.on("end", function () {
// parser stream is done, and ready to have more stuff written to it.
});
parser.write('<xml>Hello, <who name="world">world</who>!</xml>').close();
构造参数
支持设置 :
-
xmlns-布尔 若为true,然后支持命名空间。 默认 实值false。 。 。 . -
position-布尔 若为false,然后不要跟踪行/行/位置。 未设定为 被视为true默认值未设置。 目前,设定为false仅限 导致表面变化:报告的错误不包含位置 资料。 sax-js会从字面上关闭位置计算逻辑,如果 此旗被设定为假. 概念是,它将优化 执行。 至少是在萨克斯岛 不断测试这面旗帜 导致成本抵消了关闭这一逻辑的好处. -
fileName- 弦乐。 设置错误报告的文件名 。 这只有用 当跟踪位置。 你可以让它不固定. -
fragment-布尔 若为true,将 XML 分析为 XML 片段。 默认是false。 。 。 . -
additionalNamespaces- 一个普通对象,其密钥,值对定义 解析 XML 文件前已知的命名空间 。 不可以通过 命名空间绑定"xml"或者说"xmlns"。 。 。 . -
defaultXMLVersion- XML 规格的默认版本,如果 该文档中没有 XML 声明。 如果文档确实包含 XML 声明,然后忽略此设置。 一定是这样"1.0"或者说"1.1"编辑 默认为"1.0"。 。 。 . -
forceXMLVersion-布尔 显示是否强制 XML 的旗帜 用于解析到defaultXMLVersion当此旗帜 实值true, (中文(简体) ),defaultXMLVersion必须指明。 未说明的 此旗帜的默认值是false。 。 。 .示例:假设您正在解析一个具有 XML 声明的文档 指定 XML 版本 1.1.
如果你准备好了
defaultXMLVersion改为"1.0"不设置forceXMLVersion然后, XML 声明将覆盖defaultXMLVersion,文档将按 XML 1.1 进行解析.如果你准备好了
defaultXMLVersion改为"1.0"设置forceXMLVersion改为true,则XML声明将被忽略,文档将被忽略 根据XML 1.0. 解析.
方法
write - 把字节写到溪上 你不必通过整份文件
在一个 write 电话 您可以逐个读取源代码并拨打 write
每个块.
close - 关闭溪流。 关闭后,将不再写入数据
处理缓冲器完成,缓冲器由 end 活动.
属性
剖析器有以下属性:
line, (中文(简体) ), column, (中文(简体) ), columnIndex, (中文(简体) ), position - 表明在俄罗斯联邦境内的立场
XML 文档, 解析器正在查找 。 这个 columnIndex 属性
计数列,如索引为 JavaScript 字符串,而 column
属性计算 Unicode 字符.
closed - 布尔表示解析器是否可以写入 。 若为
这是 true,然后等待时间 ready 再次写入的事件.
opt - 任何选择权传入建筑师.
xmlDecl - 本文的XML声明。 里面有田园
version, (中文(简体) ), encoding 财务报告和审定财务报表 standalone他们都是 undefined 在此之前
遇到 XML 声明 。 如果在 XML 之后未定义
声明,声明没有设定相应的值。 没有
与 XML 声明相关的事件。 在成型良好的文档中, XML
在声明之前只能有一个可选的BOM。 所以,到时候任何事件
通过解析器生成的,如果存在,则声明已被处理
一点也不 否则,你有一个错误的文件, 如上所述,你
无法依赖解析器数据 !
处理错误
即使遇到错误 解析器也继续分析 并尽力
继续报告错误。 你应该注意所有报告的错误。 之后
但是,Saxes可能会错误地解释文档。 比如说
<foo a=bc="d"/> 是无效的 XML 。 你是故意的吗 <foo a="bc=d"/> 或者说
<foo a="b" c="d"/> 还是别的变异? 为了继续
提供出错, saxes 将继续解析文档,但结构
报告可能不正确。 只有在文档中更正错误后
萨克斯可以对文件提供可靠的解释.
这让你有两种拇指规则 当使用萨克斯:
-
注意萨克斯报告的错误. 默认
onerror处理器 扔出,所以默认情况下,不能漏出错误. -
一旦发生错误,停止 复用其他手 超过
onerror。 。 。 . 如上所解释,当萨克斯 进入一个良好的形状 问题,它是一个猜测 为了继续报告更多的错误。 这个猜想 也许错了.
活动
为了听一个事件, 取消 on<eventname>。支持的活动清单
也在导出中 EVENTS 阵列.
关于每个被支持者的描述,请参看源代码中的 JSDOC 注释 活动.
解析 XML 碎片
XML 规格没有定义用于解析 XML 的任何方法 碎片 不过,有些使用假想方案是可取的 碎片 为了允许这一点,萨克斯提供了三个初始化选项.
如果你通过选项 fragment: true 到解析器构建器, 解析器
将会等待 XML 碎片 。 基本上从解析状态开始
相当于它将会在其中,如果 parser.write("<foo">) 被调用
初始化后立即开始 换句话说,它期望的内容是
在元素内可接受。 也关闭了造型良好的检查
当解析出碎片时不合适.
选项 additionalNamespaces 允许您定义额外的前缀到 URI
解析开始前已知的约束。 你会用这个 resolvePrefix 若为
您已经准备好一系列的命名空间 绑定使用.
选项 resolvePrefix 如果
它无法自行解决命名空间前缀。 你会用这个
additionalNamespaces 在获得完整定义清单的情况下
名称空间很繁琐.
注意,您可以使用 additionalNamespaces 财务报告和审定财务报表 resolvePrefix 一起来,如果你
想要吗. additionalNamespaces 适用前 resolvePrefix。 。 。 .
二. 备选方案 additionalNamespaces 财务报告和审定财务报表 resolvePrefix 本来是
用于解析碎片。 然而,萨克斯不会阻止你使用它们
与 fragment: false。请注意,如果你这样做,文档可能会解析
没有出错,但因文档可以引用命名空间而变形
未定义的 内 文档.
当然, additionalNamespaces 财务报告和审定财务报表 resolvePrefix 仅当 xmlns
实值 true。如果你正在解析一个不使用命名空间的片段,那么
设置这些选项没有意义.
性能提示
-
saxes在使用新行的文件上工作得更快(
\u000A)作为行尾 与使用行标其它端的文件相比的标记(如\r或者说\r\n) (中文(简体) ). XML 规格要求符合要求的应用程序行为 仿佛所有要当作行尾字符的字符都是 转换为\u000A在解析之前。 萨克斯的最佳代码路径是 所有行尾字符已经存在的文件\u000A。 。 。 . -
不要将Unicode字符串分割给替身的萨克斯. 当你 在 JavaScript 中天真地拆分一个字符串, 您冒着拆分 Unicode 的风险 字符为两个代词。 譬如说. 在以下例子中:
a财务报告和审定财务报表b每一个都包含一个单一 Unicode 字符的一半 :const a = "\u{1F4A9}"[0]; const b = "\u{1F4A9}"[1]如果将这种分拆的代词输入版本 4点前的萨克斯,你会出错的 Saxes 第4版及以上可以 检测某一块数据以代孕结束并结转代孕 到下一个块。 然而,这一行动需要切开和装饰 字符串。 如果你能以不分裂代孕的方式提供数据, 你应该这样做。 (显然,一次用单笔输入所有数据) 速度最快。) -
不要设置你不需要的事件处理器。 撒克逊人总是要避免 但未来的改进希望做到这一点 更激烈。 萨克斯知道是否需要一些数据的方法之一是 通过检查是否为特定事件设置了处理器.
财务问题
Q. 为什么Saxes放弃了对限制数据块大小的支持 事件处理者?
A. 用萨克斯可以设置 MAX_BUFFER_LENGTH 来限制
传输给事件处理者的数据块大小 。 所以,如果你碰到一个字段
超过限额, 多次 text 发射数据块较小的事件
而不是一个大块的单一事件.
但是,这一功能有一些有问题的特点。 它有一个
任意默认值。 它是一个全库,所以所有解析器 从一个
单例 sax 图书馆共享。 这有可能导致
在同一 VM 中运行但使用 sax 处理不同的库之间的冲突
目标.
这些问题本来可以很容易地解决,但还有更大的问题。 这个
缓冲限制任意适用于某些事件,而不适用于其他事件。 它会分裂
text, (中文(简体) ), cdata 财务报告和审定财务报表 script 事件。 但是,如果 comment, (中文(简体) ),
doctype, (中文(简体) ), attribute 或者说 processing instruction 不仅仅是
限制, 解析器会生成一个错误, 而您被留到
块.
这不是直觉使用。 你觉得把限制定在1K就可以阻止
大于 1K 块将传递给事件处理者 。 但这不是
案例。 源代码中的评论告诉你,如果
您将大块传递到 write所以,如果你想要1K的限制, 不要通过64K
块到 write相当公平 你知道你想要什么限制,所以你可以
控制您传递到的数据大小 write。所以您将块限制在
write 一次到1K 一次到1K 一次到1K 即使你这样做,你的事件处理者也会得到数据
大小为 2K 的块 。 假设之前 write 解析器有
刚刚处理完一个打开的标签, 所以它已准备好文本 。 write
超过1K文本。 您还没有超过极限, 所以没有生成事件
还没有。 下一个 write 再通过一K文本。 碰巧是萨克斯检查
每起缓冲限制一次 write,则在数据块已
已处理。 现在你到了极限,你得到一个 text 2K 时的事件
数据。 所以,即使你限制你的 write 呼叫你设定的缓冲限制,
您可能仍然得到 块以两倍的缓冲大小限制的事件
页:1.
我们可考虑恢复同等功能,条件是 解决上述问题,不会给 用例假想不需要它.