Ten sam problem tutaj. Wydaje się być błędem wewnątrz JVM z powodu ewolucji.
Mam traked go do com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverFragment
w Javie 7u21 & przed:
91: // Element selectedElem = doc.getElementById(id);
92: selectedElem = IdResolver.getElementById(doc, id);
w Javie 7u25:
87: selectedElem = doc.getElementById(id);
//...
93: if (secureValidation) {
secureValidation
odnosi się do ewolucji 7u25 java na walidacji XML Sig (patrz changelog), więc muszą mieć
uszkodzone
zmienił coś innego podczas pracy nad tą ewolucją.
Rozwiązaliśmy ten problem, dostarczając niestandardową javax.xml.crypto.URIDereferencer
do javax.xml.crypto.dom.DOMCryptoContext.setURIDereferencer(URIDereferencer)
, która jest w stanie rozwiązać węzeł, który nie znajduje się jeszcze w drzewie dokumentu DOM (fragmenty w obiekcie XMLObject).
Zgłaszam to teraz do Oracle, zaktualizuję odpowiedź identyfikatorem błędu.
EDIT: Znalazłem to w apache SVN
Edit 2: Dzięki this bug report mam rozumieć, że jest to ewolucja w XML "id" atrybuty obsługi.
Poprzednie wersje Java/JSR-105/SANTUARIO kiedyś bardzo tolerancyjny atrybutów „id” stosowanych w document.getElementById(...)
ale ta nowa wersja wymaga atrybut, który jest identyfikowany jako ID XML mówienia. Chodzi mi o to, że nazwanie atrybutu "Id" lub "ID" już nie jest wystarczające, musisz go ostatecznie oznaczyć jako ID, przez weryfikację schematu XSD/DTD.
Niefortunnie, podążam za schematem, który nie jest prawidłowy i dlatego nie można go parsowac przez Javę.
Jeśli znajdujesz się w takiej samej sytuacji, zapoznaj się z poniższym rozwiązaniem. W przeciwnym razie, jeśli dokument XML ma poprawny schemat, spojrzeć na rozwiązania @sherb https://stackoverflow.com/a/17437919/233906
Rozwiązanie
szczęście, można tag atrybutem jako ID, stosując metody jak Element.setIdAttributeNode(org.w3c.dom.Attr,boolean)
.
Łącząc z małą XPath jak descendant-or-self::*/@Id
, aby pobrać Attr
węzłów "Id" oraz trochę Java ((Element)attr.getOwnerElement()).setIdAttributeNode(attr,true)
powinien wydostać się z kłopotów.
Ale bądź ostrożny:setIdAttributeXXX()
jest ważny tylko dla bieżącego dokumentu & węzła. Jeśli clone
/adopt
/import
trzeba zrobić setIdAttributeXXX()
o nowych węzłów każdym drzewie DOM
Hi Kresok i zapraszamy do stackoverflow. Wziąłem głos, ale proszę zgłosić kompletny stacktrace i spróbować sformatować stacktrace jako kod (za pomocą przycisku '{}'). –
W końcu znalazłem obejście tego nowego ograniczenia Java ... zobacz poniżej – Cerber