Ответ 1
Такая же проблема. Кажется, это ошибка в 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
относится к эволюции java 7u25 при проверке XML Sig (см. журнал изменений), поэтому они должны иметь broken изменил что-то еще во время работы над этой эволюцией.
Мы работали над этой проблемой, предоставив пользовательский javax.xml.crypto.URIDereferencer
to javax.xml.crypto.dom.DOMCryptoContext.setURIDereferencer(URIDereferencer)
, который может разрешить node, которые еще не находятся в дереве документов DOM (фрагменты в XMLObject).
Я сообщаю об этом Oracle прямо сейчас, я обновлю ответ с идентификатором ошибки.
EDIT: нашел это в apache SVN
Изменить 2: Благодаря этот отчет об ошибке Я понял, что это была эволюция в XML "Id" .
Предыдущие версии java/JSR-105/SANTUARIO были очень терпимыми к атрибутам "Id", используемым в document.getElementById(...)
, но для этой новой версии требуется атрибут, который обозначается как ID. Я имею в виду, что присвоение имени "Id" или "ID" больше не является достаточным, вам нужно, чтобы он был помечен как идентификатор, в конечном итоге с помощью проверки схемы XSD/DTD.
Несчастливо, я следую схеме, которая недействительна и поэтому не обрабатывается Java.
Если вы находитесь в той же ситуации, см. мое решение ниже. В противном случае, если у вас есть документ XML, есть действительная схема, посмотрите на решение @sherb fooobar.com/questions/261775/...
Решение
К счастью, вы можете пометить атрибут как идентификатор, используя методы, такие как Element.setIdAttributeNode(org.w3c.dom.Attr,boolean)
.
Объединяясь с небольшим XPath, как descendant-or-self::*/@Id
, чтобы извлечь Attr
"Идентификационные" узлы плюс небольшая Java ((Element)attr.getOwnerElement()).setIdAttributeNode(attr,true)
, вы должны избавиться от проблем.
Но будьте осторожны: setIdAttributeXXX()
действителен только для текущего документа и node. Если вы clone
/adopt
/import
, вам нужно сделать setIdAttributeXXX()
в новых узлах каждого дерева DOM