我有一个xml文件和一个dtd定义。我对sax解析器的理解是它处理事件而不是将整个xml文档(如DOM)存储在内存中。说,我有一个xml文件,其声明类似于<名称> ... //这里有大约200万行< /名称>那么,在这种情况下,sax解析器将在内存中存储什么?它是如何知道结束标记名称将发生的。现在真正的问题是,sax解析器如何验证dtd?我不是在寻找深入的解释,而只是关于验证如何发生的一般想法。
答案 0 :(得分:2)
通常,DTD被转换为一组有限状态自动机 - 有一种标准算法,用于将BNF语法转换为确定性FSA,可在编译器教科书(如Aho和Ullmann)中找到。这将为每个元素的内容模型生成一个FSA。因此,解析/验证的当前状态由每个打开元素保持一个FSA(具有其当前状态)的堆栈表示。当解析器遇到开始标记时,它会检查该开始标记是否代表最顶层FSA中的有效转换,并通过进行此转换来更改该FSA中的当前状态。它还为与新元素的内容模型的FSA相对应的堆栈添加了新的FSA。当它看到一个结束标记时,它会检查最顶层FSA的当前状态是否为最终状态,并将该FSA从堆栈中弹出。