【发布时间】:2012-08-29 12:07:30
【问题描述】:
根据Validating a HUGE XML file 同意,但我仍然感到困惑......如何使用 SAX 解析进行 XML 模式验证。我的意思是模式验证涉及在 XML 中来回进行验证 - 键引用等。整个 XML 不应该在内存这样做? 抱歉这个愚蠢的问题:(
【问题讨论】:
根据Validating a HUGE XML file 同意,但我仍然感到困惑......如何使用 SAX 解析进行 XML 模式验证。我的意思是模式验证涉及在 XML 中来回进行验证 - 键引用等。整个 XML 不应该在内存这样做? 抱歉这个愚蠢的问题:(
【问题讨论】:
大多数解析器必须在开始任何验证之前在内存中构建一个 Schema/DTD 树,之后它主要是按顺序查找,有时还会进行一些推送、查看和弹出操作。
【讨论】:
可以使用几乎为零的内存来对架构进行验证。 UPA 约束确保针对内容模型的验证永远不需要回溯。当然,您确实需要在内容模型的 FSM 中跟踪堆栈中每个元素的状态,即内存与文档的最大嵌套深度成正比。
ID/IDREF 验证是一个例外:为此,处理器需要与遇到的 ID 和 IDREF 值的数量成比例的内存。粗略地说,处理器会记住找到的所有 ID 和 IDREF 值,当它到达文档末尾时,检查是否没有 ID 出现两次,并且每个 IDREF 都出现在这些 ID 中。类似地,为了检查 unique/key/keyref,处理器需要记住已找到哪些键值。但这所需的内存比“将整个 XML 保存在内存中”要少得多。
【讨论】: