1

我定义了一个 xml 文件和一个 dtd。我对 sax 解析器的理解是它处理事件而不是将整个 xml 文档(如 DOM)存储在内存中。比如说,我有一个声明像 <name> ... // 这里大约 200 万行 < /name> 的 xml 文件。那么,在这种情况下,sax 解析器将在内存中存储什么?它如何知道结束标签名称会出现。现在真正的问题是,sax 解析器如何针对 dtd 进行验证?我不是在寻找深入的解释,而只是关于验证如何发生的一般想法。

4

1 回答 1

2

通常,DTD 被转换为一组有限状态自动机——在 Aho 和 Ullmann 等编译器教科书中可以找到将 BNF 语法转换为确定性 FSA 的标准算法。这将为每个元素的内容模型生成一个 FSA。因此,解析/验证的当前状态由为每个打开元素保存一个 FSA(及其当前状态)的堆栈表示。当解析器遇到一个开始标记时,它会检查该开始标记是否代表最顶层 FSA 中的有效转换,并通过进行此转换来更改该 FSA 中的当前状态;它还将新的 FSA 添加到与新元素的内容模型的 FSA 对应的堆栈中。当它看到一个结束标记时,它会检查最顶层 FSA 的当前状态是否为最终状态,并将这个 FSA 从堆栈中弹出。

于 2011-04-30T21:27:06.417 回答