我有一个类似下面的XML文件。
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
Destination="https://hostname.example.com:4444/fed/idp/samlv20"
ID="id-OPIfhD3il2eK816THPlj2Nk38KM-"
IssueInstant="2014-09-02T14:36:02Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Version="2.0"
>
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity"
>https://federation.example.com/sp</saml:Issuer>
<samlp:NameIDPolicy AllowCreate="true"
Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"
/>
<samlp:RequestedAuthnContext Comparison="exact">
<saml:AuthnContextClassRef xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
</samlp:RequestedAuthnContext>
</samlp:AuthnRequest>
如何使用JDOM从上面的XML中获取内容“https://federation.example.com/sp”?
我正在尝试以下代码并能够检索“IssueInstant”&amp; “ProtocolBinding”成功。但无法检索内容“https://federation.example.com/sp”。请帮忙。
private String[] getRequestAttributes(String xmlString) throws SamlException {
Document doc = Util.createJdomDoc(xmlString);
if (doc != null) {
String[] samlRequestAttributes = new String[2];
samlRequestAttributes[0] = doc.getRootElement().getAttributeValue(
"IssueInstant");
samlRequestAttributes[2] = doc.getRootElement().getAttributeValue(
"ProtocolBinding");
return samlRequestAttributes;
}
}
答案 0 :(得分:0)
private String[] getRequestAttributes(String xmlString) throws SamlException { Document doc = Util.createJdomDoc(xmlString); if (doc != null) { String[] samlRequestAttributes = new String[2]; samlRequestAttributes[0] = doc.getRootElement().getAttributeValue( "IssueInstant"); samlRequestAttributes[2] = doc.getRootElement().getAttributeValue( "ProtocolBinding"); return samlRequestAttributes; } }
由于一些原因,上述代码不起作用。首先,samlRequestAttributes[2] = ...
行将抛出一个ArrayIndexOutOfBounds异常,因为没有索引值2.您应该使用索引1.
你没有指出你想要存储值https://federation.example.com/sp
的位置,但我想你会想要它在某个地方的返回数组中(可能在索引1处?)。
检索它的方法是正确使用XML命名空间。
请考虑以下事项:
private String[] getRequestAttributes(String xmlString) throws SamlException {
Document doc = Util.createJdomDoc(xmlString);
if (doc != null) {
Namespace saml = Namespace.get("urn:oasis:names:tc:SAML:2.0:assertion");
String[] samlRequestAttributes = new String[3];
Element root = doc.getRootElement();
samlRequestAttributes[0] = root.getAttributeValue("IssueInstant");
samlRequestAttributes[1] = root.getAttributeValue("ProtocolBinding");
samlRequestAttributes[2] = root.getChild("Issuer", saml).getText();
return samlRequestAttributes;
}
}
注意您需要如何识别子元素的命名空间,并在getChild调用中使用正确的命名空间从根文档中检索它。