【问题标题】:Is there a way to find the anomalies in an XML file without actually parsing it?有没有办法在不实际解析的情况下找到 XML 文件中的异常?
【发布时间】:2016-02-14 11:37:39
【问题描述】:

我有一个应用程序,它只是将 XML 文件作为 BLOB 上传到数据库。 我知道有几种使用DocumentBuilderFactoryDocumentBuilder 进行 XML 验证的方法,然后对其进行解析等,但是我正在谈论的数据是巨大的,并且输入 XML 文件中发生异常的可能性较小..

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

【问题讨论】:

  • 为避免创建内存文档,请改用SAXParser。它将报告格式正确的viaolations,也可以配置为进行验证。

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


【解决方案1】:

没有。

解析,顾名思义,是在创建其他所需结构的过程中对词法结构的处理。评估是否符合预期的词汇形式和逻辑语法,通常会报告违规情况。

所有 XML 解析器都将评估是否符合 XML 标准 (well-formedness); 验证 XML 解析器还将评估与模式 (validity) 的一致性。

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

【讨论】:

    【解决方案2】:

    有点。

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

    这将在有限的范围内进行解析(因此我说“有点”而不是“是”),但实际上不会从 XML 中检索任何信息(因此我说“有点”而不是“否”)。

    不过,如果操作正确,您将获得只进流式解析器的一半。真的,除非您对内容有一些进一步的限制(让您安全地采取一些捷径),否则您最好使用仅向前的流解析器进行检查;如果您没有错过一些边缘情况,并且几乎同样有效,那么您的工作就会少得多,而且更有信心。由于您将使用仅向前解析器但丢弃所有结果,因此内存使用应该很轻,并且成本大约为 O(1) 到流的大小(根据树的深度会有一些额外的成本,但是最小)。

    【讨论】:

      猜你喜欢
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      相关资源
      最近更新 更多