Я переношу свое приложение с Java 8 на Java 11. В Java 8 мой входной XML-файл анализировался правильно, но в Java 11 nodeList.getLength()
возвращает 0
.
Пожалуйста, обратитесь к коду, согласно которому я всегда получаю сообщение об ошибке : Cannot find signature
.
Я пробовал использовать document.getElementsByTagName("Signature")
вместо getElementsByTagNameNS()
, что возвращает правильный length
. Однако метод unmarshalXMLSignature()
затем выдает ошибку, что реализация документа должна поддерживать DOM уровня 2 и учитывать пространство имен.
Есть ли проблемы с использованием метода getElementsByTagNameNS()
в Java 11?
private DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
. . .
document = documentBuilderFactory.newDocumentBuilder().parse(input);
final NodeList nodeList = document.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
if (nodeList.getLength() == 0) {
throw new SecurityException("Cannot find signature");
}
final XMLValidateContext validateContext = new DOMValidateContext(newX509KeySelector(), nodeList.item(0));
final XMLSignature signature = getXMLSignatureFactory().unmarshalXMLSignature(validateContext);
. . .
Редактировать 1: входной xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><License>
<id>999</id>
<companyName>TRXX</companyName>
<creationDate>01-01-2016</creationDate>
<expirationDate>never</expirationDate>
<features>
<feature>
<name>drwwy</name>
<value>true</value>
<description>drwwy module</description>
</feature>
<feature>
<name>pnp</name>
<value>true</value>
<description>Index Number Management module</description>
</feature>
</features>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI="">
<Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>l5Cl4E=</DigestValue></Reference></SignedInfo><SignatureValue>R3zBkE=</SignatureValue>
<KeyInfo><X509Data><X509SubjectName>CN=TRXX Inc,OU=Product Development,O=TRXX Inc,L=Scotle,ST=Atlanta,C=US</X509SubjectName><X509Certificate>MIY</X509Certificate>
</X509Data></KeyInfo></Signature></License>
Редактировать 2: я понял, что ранее я вводил DocumentBuilderFactory, который является частью JDK, но он больше не разрешен в Java 11. Вот почему я создал его с помощью DocumentBuilderFactory.newInstance(), но с этим длина моего списка узлов равна нуль. Можем ли мы использовать какой-либо другой способ создания экземпляра объекта DocumentBuilderFactory?