gpt4 book ai didi

java - 禁止对 XML 的一部分进行验证

转载 作者:行者123 更新时间:2023-11-30 11:37:14 33 4
gpt4 key购买 nike

我们有一个沼泽标准 javax.xml.*分析一个大的 XML 文件并尝试根据自定义 DTD 对其进行验证的解析器。 DTD 存储在本地,我们正在使用转换器进行验证 like in this post几年前。

所有这些都有效。我们现在看到的麻烦是这种文件的XML格式是魔鬼写的。我不是在开玩笑;说明书超过 750 页,并署名“Love, Satan”。

具体来说,部分 XML 如下所示:

<KnownTag>
<ArbitraryTag> ... text ... </ArbitraryTag>
<Whatever> ... text ... </Whatever>
<fj9e8jer23tj> ... text ... </fj9e8jer23tj>
....
</KnownTag>

内部标记是平衡的——此时已知原始语法是格式良好的 XML——但元素名称本身是完全任意且不可预测的。 (是的,就是这么邪恶。最初发布此规范的公司早已倒闭,因为他们的产品是出了名的不可靠。想想吧。)

我们的自定义 DTD 可以指定 <!ELEMENT KnownTag ANY> , 但我们对内容不满意。显然,验证解析器一旦遇到第一个用户指定的元素名称(必须声明元素类型“ArbitraryTag”)就会出错,显然我们无法真正“验证”该 block 内的任何内容来自纯粹的解析上下文。我希望找到某种方法来抑制那部分 XML 的错误。

  • 解析器的错误处理接口(interface),ErrorHandler , 指定 3 个回调;它的error()在这种情况下被调用。如果我能从 the actual exception passed in 中算出我们在KnownTag里面 block ,然后我可以安全地忽略错误并继续前进。这对 Java SE 实现安全吗?

  • 之后访问任意元素应该不是问题,因为此时 XML 解析器本身已经构建了 DOM 文档。

  • API javax.xml.parsers.DocumentBuilder[Factory]javax.xml.transform.Transformer似乎不允许切换 DocumentBuilderFactory#setValidating()在解析的中途。如果是这样的话,也就不足为奇了,但我希望我只是错过了一些东西。有人吗?

最佳答案

DTD 没有跳过对格式良好的 XML 的特定子树的验证的机制;这是 DTD 与后来的模式语言(如 XSD 和 Relax NG)之间的差异之一,后者引入了通配符,使得可以说“KnownTag 元素可以包含任意 XML”(或者:任意元素不在一个特定的命名空间中,或在任何一组特定的命名空间中,或......)。

您的解析器是否具有关闭特定子树中的错误报告的功能完全是特定于解析器的;您需要描述您使用的是众多基于 Java 的 XML 解析器中的哪一个。机会渺茫;解析器并非不可能具有这样的功能,但乍一看,这听起来不像是符合规范的行为。 (这也不是我听说过的基于 DTD 的 validator 具有的功能,但这实际上并不能证明太多。)

关于java - 禁止对 XML 的一部分进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14127752/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com