2011-04-29 73 views
1

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

回答

2

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