【问题标题】:Is there a way in Java to validate against XSD without SAX?Java 中有没有一种方法可以在没有 SAX 的情况下针对 XSD 进行验证?
【发布时间】:2015-02-04 22:31:15
【问题描述】:

我正在查看有关 SAX (Simple API for XML) 的维基百科文章,我对 SAX 解析的这个缺点感到有些困惑:(明显缺少引用)

几乎任何类型的 XML 验证都需要完整访问文档。

我发现这难以置信 - 例如,javax.xml.validation.Validator 对象会到处抛出 SAX 异常。

有没有一种方法可以在不使用 SAX 解析器的情况下验证 Java 中的 XSD?如果没有,您能否在不使用 SAX 解析器的情况下验证 Java 中的 XML 文档——也许使用 XSD 以外的其他东西?

【问题讨论】:

    标签: xml validation schema sax


    【解决方案1】:

    不要相信你在维基百科上读到的一切。它继续说,要验证 IDREFS,您(显然)需要维护文档中所有 ID 的集合。这并不意味着整个文档都需要在内存中。

    【讨论】:

      【解决方案2】:

      您的问题似乎存在错误的矛盾。考虑一下你引用的这个引文:

      几乎任何类型的 XML 验证都需要完整访问文档。

      你说:

      我觉得这很难相信......

      我的阅读是:您怀疑是否需要完整访问文档 -> 您认为在内存中没有完整文档的情况下必须可以验证。

      然后你问:

      有没有一种方法可以在不使用 SAX 解析器的情况下验证 Java 中的 XSD?

      要么这是两个不相关的事情,要么我看不到矛盾。 validate ... 不使用 SAX 解析器validate 而没有内存中的完整文档 有何关系? SAX 解析器通常用于低级 XML 解析,然后基于 SAX 事件构建完整的 DOM 文档。我看不出避免 SAX 解析器的意义,你为什么要避免?


      我想,你真正要问的是,如果维基百科文章所说的是真的,如果你真的需要整个文档在内存中。

      这里有两个方面:理论和实践。

      理论上我会说大多数情况实际上并不需要内存中的整个文档。大多数事情都可以通过状态机(或类似的东西)和文字验证来验证。

      我认为(但不是 100% 肯定)在某些情况下,您可能需要将整个(或几乎整个文档)保存在内存中。例如,对于 XSD 1.1。替代方案我可以想象第一个 N-1 子元素的有效性取决于最后一个 Nth 子元素的情况。您可能需要将所有 N 保留在内存中。

      或者这种情况下ID/IDREF。我同意 Michael Kay 的观点,实际上只保留 id 就足够了,但这些 id 可能(几乎)在边缘情况下构成整个文档。

      实际上,我想在内存中处理文档比验证 SAX 或 StAX 事件流要容易得多。

      【讨论】:

      • 错误的矛盾源于一篇 wikipedia 文章的混乱:这篇文章是关于 SAX 的,而这句话取自标题为“缺点”的部分。在我看来,这篇文章暗示所有验证都需要完整的文档,但 SAX 不会完整处理文档,因此 SAX 是一种无效的验证工具。然而,这与它在 XSD 验证中的广泛使用相矛盾——这是我试图解决的矛盾。
      • @RichardJPLeGuen 广泛使用 SAX 进行 XSD 验证?真的吗?这有什么来源吗? SAX 通常只用于中低级别的 XML 解析。然后建立和验证一些文档模型。我从未听说过仅 SAX 的 XSD 验证器。
      • 已经两年了,但当时我正在处理一些 XSD 的东西,并且一直在寻找 SAX .. 并且从问题 - “例如 javax.xml.validation.Validator 对象抛出 SAX 异常在这个地方。”
      • 虽然看起来我搞砸了问题中的javax.xml.validation.Validator 超链接。
      【解决方案3】:

      几乎任何类型的 XML 验证都需要访问文档 完整的。

      SAX 的本质是调用者和 SAX 库之间的交互基于在解析事件发生时给予控制的回调。 (相比之下,基于 DOM 的解析的本质是在内存中构建文档的完整表示,然后调用者可以使用 DOM 库调用对其进行检查。)

      验证解析器(例如您在 Java 中提到的基于 SAX 的解析器)可以承担保留根据模式验证 XML 所必需的状态的负担。 您引用的 Wikipedia 声明在这种情况下确实有些令人困惑。 为了理解其意图,假设您作为应用程序程序员,需要执行额外的测试,这些测试需要比呈现给每个回调的状态更多的状态。 (它可能不是“完整的文档”,但它可能会比单个 SAX 回调中呈现的更多。)是的,验证 SAX 解析器工作,但它们必须保留额外的状态才能执行验证。作为应用程序程序员,您可能还必须保留额外的状态来应用额外的应用程序级测试,维基百科作者打算用引用的语句传达维护这种状态的额外工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-28
        • 2011-09-30
        • 2022-08-21
        • 1970-01-01
        • 1970-01-01
        • 2020-09-17
        相关资源
        最近更新 更多