我正在尝试解析包含名称空间元素的常规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。
修改
有许多类似的问题,但是那些忘记启用命名空间感知的人都会问这些问题。
修改
为了精确起见,我使用open JDK 1.8.0.151运行此代码。
答案 0 :(得分:2)
getElementsByTagNameNS()的第一个参数是名称空间URI,而不是前缀。所以它应该是
return document.getElementsByTagNameNS("urn:oasis:names:tc:SAML:2.0:assertion", "Assertion");