You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by Christopher Schultz <ch...@christopherschultz.net> on 2021/02/17 21:56:19 UTC
[digester] Decoding some complex namespace stuff
All,
I'm trying to parse n SAML response which, among other things, has
arbitrary name/value pairs which look like this:
<saml2:Attribute Name="attribute-name">
<saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xs:string">attriute-value</saml2:AttributeValue>
</saml2:Attribute>
I'm using Digester 3.2 and In the past I've been doing something like this:
digester.addCallMethod("..../Attribute", "setAttribute", 2, THREE_STRINGS);
digester.addCallParam("..../Attribute/AttributeValue", 0, "xsi:type");
digester.addCallParam("..../Attribute", 1, "Name");
digester.addCallParam("..../Attribute/AttributeValue", 2);
This will call my bean's setAttribute method with 3 parameters:
1. The value of the "xsi:type" attribute
2. The value of the "Name" attribute
3. The value of the CDATA child of the AttributeValue element
This worked great until someone presented me with a SAML message where
the namespaces are different:
<saml:Attribute Name="attribute-name"
NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml:AttributeValue
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="xsd:string">attribute-value</saml:AttributeValue>
</saml:Attribute>
Note that I was expecting xsi: as the namespace prefix for the "type"
attribute (which is the same), but this vendor has used "xsd:" as the
namespace prefix for the XMLSchema namespace instead of "xs:" which is
also common.
I couldn't determine any way to interact with direct methods on the
Digester class to specify certain namespaces for things, so I decided to
write my own Rule and see what I could do. I have bound this rule to
"..../AttributeValue" and it currently just dumps out information:
System.out.println("Got element " + getNamespaceURI() + ":" + name
+ " with attrs " + attributes);
System.out.println("attribute ns: " + namespace);
System.out.println("Attribute count: " + attributes.getLength());
System.out.println("http://www.w3.org/2001/XMLSchema-instance:type=" +
attributes.getValue("http://www.w3.org/2001/XMLSchema-instance", "type"));
This prints:
Got element null:AttributeValue with attrs
com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser$AttributesProxy@55a561cf
attribute ns: urn:oasis:names:tc:SAML:2.0:assertion
Attribute count: 1
http://www.w3.org/2001/XMLSchema-instance:type=xsd:string
So it looks like I can fetch the value of the "type" parameter by using
the actual namespace definition, which is great. But the value is a
string which is either "xs:string" or "xsd:string" depending on who sent
the SAML response.
Now the simple thing to do would be to accept either, but I'd like to do
this "properly". The namespace declarations are present on the
<AttributeValue> element, but the attribute "count" is only 1 for the
AttributeValue element.
Is there a way to get the namespace prefix for the namespace
"http://www.w3.org/2001/XMLSchema" so I can (a) validate and (b) remove
it from the "type" attribute's value? I'm hoping to end up with "string"
and know that "string" is defined by the
"http://www.w3.org/2001/XMLSchema" namespace.
Thanks,
-chris
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org