我试图解析包含名称空间元素的常规XML。但是,getElementsByTagNameNS()始终返回一个空的NodeList。例如,下面的代码(其中已经包含名称空间并且可用)已在其中硬编码了一些SAML文本,因此返回一个空的NodeList:

NodeList test() {
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    documentBuilderFactory.setNamespaceAware(true);
    documentBuilderFactory.setValidating(false);
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

    Document document = documentBuilder.parse(new StringInputStream(
                    "<samlp:Response xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\" xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">\n" +
                    "    <saml:Assertion>\n" +
                    "    </saml:Assertion>\n" +
                    "</samlp:Response>"
    ));

    return document.getElementsByTagNameNS("saml", "Assertion");
}


问题是,我已将其设置为可识别名称空间。据我所知,这应该返回一个有结果的NodeList。

编辑

有许多类似的问题,但是都是忘记了启用名称空间意识的人提出的。

编辑

为了精确起见,我使用开放式JDK 1.8.0.151运行了此代码。

最佳答案

getElementsByTagNameNS()的第一个参数是名称空间URI,而不是前缀。所以应该

return document.getElementsByTagNameNS("urn:oasis:names:tc:SAML:2.0:assertion", "Assertion");

08-19 01:49