【问题标题】:How does a sax parser validate against a dtd?sax 解析器如何验证 dtd?
【发布时间】:2011-04-29 16:56:12
【问题描述】:

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

【问题讨论】:

    标签: xml jaxp


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-19
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2023-03-13
      • 2015-04-12
      相关资源
      最近更新 更多