有没有办法在没有实际解析的情况下找到XML文件中的异常?

时间:2016-02-14 11:37:39

标签: xml parsing xsd xsd-validation xml-validation

我有一个应用程序只需将XML文件作为BLOB上传到数据库。 我知道有几种方法可以使用DocumentBuilderFactoryDocumentBuilder进行XML验证,然后对其进行解析等,但我所说的数据很大,并且输入XML文件中出现异常的可能性很大少了..

但是,为了确保语法正确,有没有办法捕获文件中的异常而不实际解析每个文件?

2 个答案:

答案 0 :(得分:5)

根据定义,解析是在创建其他所需构造的过程中对词法构造的处理。评估是否符合预期的词汇形式和逻辑语法,并且通常会报告违规行为。

所有XML解析器将评估对XML标准的一致性( well-formedness ); 验证XML解析器还将评估对架构的一致性( validity )。

有人可能会选择避免使用XML解析器并实现对被认为是XML的文本对象的重要词法属性的抽查。但是,这样的进程本身也将解析;它只是临时的,通常是不明智的。

答案 1 :(得分:1)

有点。

您可以浏览整个流,检查您是否正在接收上下文的有效文本(无论您是在标记内,还是在实体引用中,或者两者都没有)在每个开始标记上推送到一堆名称并弹出和检查每个结束标签。如果需要,可以让它检查命名空间一致性。

这将解析到有限的程度(因此我说“有点”而不是“是”)但实际上并没有从XML中检索任何信息(因此我说的是“有点”而不是“不”)。 / p>

尽管如此,正确地将您带到了一个仅向前流式传输解析器的中途。实际上,除非你对内容有一些进一步的限制(这可以让你安全地做一些捷径),你最好还是使用仅向前流分析器进行检查;如果你没有错过一些边缘案例,并且几乎同样有效,那么你的工作就会少得多。由于您将使用仅向前解析器但丢弃所有结果,因此内存使用应该很轻并且成本大约为流的大小O(1)(根据树深度会有一些额外的成本,但是最小)。