这里同样的问题。由于进化,似乎是 JVM 内部的一个错误。
我把它归结为com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverFragment
在 java 7u21 及之前:
91: // Element selectedElem = doc.getElementById(id);
92: selectedElem = IdResolver.getElementById(doc, id);
在 java 7u25 中:
87: selectedElem = doc.getElementById(id);
//...
93: if (secureValidation) {
secureValidation
指的是 XML Sig 验证上的 java 7u25 演变(请参阅更改日志),因此他们在进行此演变时一定已经破坏 了其他内容。
我们通过提供一个自定义javax.xml.crypto.URIDereferencer
来解决这个问题,该自定义javax.xml.crypto.dom.DOMCryptoContext.setURIDereferencer(URIDereferencer)
能够解析尚未在 DOM 文档树中的节点(XMLObject 中的片段)。
我现在正在向 Oracle 报告此问题,我将使用错误 ID 更新答案。
编辑:在apache SVN中找到了这个
编辑 2:感谢这个错误报告,我了解到这是 XML“Id”属性处理的演变。
以前版本的 java/JSR-105/SANTUARIO 过去对使用的“Id”属性非常宽容,document.getElementById(...)
但这个新版本需要一个被标识为ID XML 的属性。我的意思是命名属性“Id”或“ID”已经不够用了,您需要将其标记为 ID,最终通过 XSD/DTD 模式验证。
不幸的是,我正在遵循一个无效的模式,因此 Java 无法解析。
如果您处于相同情况,请参阅下面的解决方案。否则,如果您的 XML 文档确实具有有效的架构,请查看@sherb 解决方案https://stackoverflow.com/a/17437919/233906
解决方案
幸运的是,您可以使用诸如Element.setIdAttributeNode(org.w3c.dom.Attr,boolean)
.
结合一点 XPath,比如descendant-or-self::*/@Id
获取Attr
“Id”节点和一点 Java ((Element)attr.getOwnerElement()).setIdAttributeNode(attr,true)
,应该可以让您摆脱麻烦。
但要小心: setIdAttributeXXX()
仅对当前文档和节点有效。clone
//如果你需要在每个adopt
DOM树的新节点上做一个import
setIdAttributeXXX()