我正在查看关于SAX (Simple API for XML)的维基百科文章,我对SAX解析的这个缺点感到有些困惑:(显然没有引用)
实际上,任何类型的XML验证都需要完整地访问该文档。
我发现很难相信 - 比如javax.xml.validation.Validator对象会在整个地方抛出SAX异常。
有没有办法在不使用SAX解析器的情况下在Java中验证XSD?如果没有,您是否可以在不使用SAX解析器的情况下使用Java验证XML文档 - 可能使用XSD之外的其他内容?
答案 0 :(得分:1)
不要相信你在维基百科中读到的一切。接着说,要验证IDREFS,您(显然)需要维护文档中所有ID的集合。这并不意味着整个文档需要在内存中。
答案 1 :(得分:0)
实际上,任何类型的XML验证都需要访问该文档 完整的。
SAX的本质是调用者和SAX库之间的交互是基于在解析事件发生时给予控制的回调。 (相比之下,基于DOM的解析的本质是在内存中构建文档的完整表示,然后调用者可以使用DOM库调用来检查它。)
验证解析器(例如您在Java中记下的基于SAX的解析器)可以承担保留根据模式验证XML所需的状态的负担。 你引用的维基百科声明在这种情况下确实有些混乱。要理解它的意图,想象一下,作为一名应用程序程序员,你需要执行额外的测试才能获得比每次回调更多的状态。 (它可能不是&#34;文档完全&#34;但它可能比单个SAX回调中提供的更多。)是的,验证SAX解析器工作,但是他们必须保留额外的状态来执行验证。作为应用程序程序员,您可能还必须保留其他状态以应用其他应用程序级别的测试,并且维护此状态的额外工作是维基百科作者打算用引用的语句传达的。< / p>
答案 2 :(得分:-1)
你的问题似乎有一个错误的矛盾。考虑一下你引用的引用:
实际上,任何类型的XML验证都需要完整地访问该文档。
你说:
我发现很难相信......
我的阅读是:您怀疑您需要完整访问该文档 - &gt;你认为必须能够在内存中没有完整文档的情况下进行验证。
然后你问:
有没有办法在不使用SAX解析器的情况下在Java中验证XSD?
这些是两个无关的事情,或者我没有看到矛盾。如何验证...而不使用与验证相关的SAX解析器而没有内存中的完整文档? SAX解析器通常用于低级XML解析,然后基于SAX事件构建完整的DOM文档。我没有看到避免SAX解析器的观点,你为什么要这样做?
我想,你真正要问的是,如果维基百科的文章说的是真的,那么真的需要整个文档在内存中。
这里有两个方面:理论和实践。
理论上我会说大多数情况实际上并不需要整个文件在内存中。大多数事情都可以通过状态机(或类似的东西)和文字验证进行验证。
我认为(但不是100%肯定)可能还有一些情况需要将整个(或几乎整个文档)保留在内存中。例如,使用XSD 1.1。备选方案我可以想象第一个N-1子元素的有效性依赖于最后一个第N个子元素的情况。您可能需要将所有N保留在内存中。
或ID
/ IDREF
的此案例。我同意Michael Kay的观点,它实际上只能保留ID,但这些ID可能会(几乎)在一个边缘情况下构成(几乎)整个文档。
实际上我想在内存中处理文档而不是验证SAX或StAX事件流更容易。