Pavel Hodek
Pavel Hodek

Reputation: 14577

How can I get value of element attribute in XML

Please how can I get value of attribute Value of element StatusCode in this XML:

<LogoutResponse 
    ID="_f525259e-7e91-4282-9dc3-a0da65a4a17a" 
    Version="2.0" 
    IssueInstant="2021-05-17T15:41:55Z" 
    InResponseTo="_5089729f-5cc0-4a66-a3c1-e710cde92897" 
    Destination="https://idp.xyz/logout.aspx" 
    xmlns="urn:oasis:names:tc:SAML:2.0:protocol">
    <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://abc.xyz/api</Issuer>
    <Status>
        <StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
    </Status>
</LogoutResponse>

Upvotes: 2

Views: 144

Answers (3)

Yitzhak Khabinsky
Yitzhak Khabinsky

Reputation: 22157

By using LINQ to XML API.

It is available in the .Net Framework since 2007.

c#

void Main()
{
    XDocument xdoc = XDocument.Parse(@"<LogoutResponse xmlns='urn:oasis:names:tc:SAML:2.0:protocol' 
        Destination='https://idp.xyz/logout.aspx' ID='_f525259e-7e91-4282-9dc3-a0da65a4a17a' 
        InResponseTo='_5089729f-5cc0-4a66-a3c1-e710cde92897' IssueInstant='2021-05-17T15:41:55Z' Version='2.0'>
        <Issuer xmlns='urn:oasis:names:tc:SAML:2.0:assertion'>https://abc.xyz/api</Issuer>
        <Status>
            <StatusCode Value='urn:oasis:names:tc:SAML:2.0:status:Success'></StatusCode>
        </Status>
    </LogoutResponse>");

    XNamespace ns1 = "urn:oasis:names:tc:SAML:2.0:protocol";

    string StatusCodeValue = xdoc.Descendants(ns1 + "StatusCode")
        .Attributes("Value")
        .FirstOrDefault()?.Value;

    Console.WriteLine("StatusCodeValue='{0}'", StatusCodeValue);
}

Output

StatusCodeValue='urn:oasis:names:tc:SAML:2.0:status:Success'

Upvotes: 0

Krishna Varma
Krishna Varma

Reputation: 4250

You can try with XmlDocument.

Note: since you have a name space (xmlns ...) all elements in your xml by default in name space. hence you are getting object reference error. I have updated the code and .netfiddle. please have a look

var xml = @"<LogoutResponse 
ID=""_f525259e-7e91-4282-9dc3-a0da65a4a17a"" 
Version=""2.0"" 
IssueInstant=""2021-05-17T15:41:55Z"" 
InResponseTo=""_5089729f-5cc0-4a66-a3c1-e710cde92897"" 
Destination=""https://idp.xyz/logout.aspx"" 
xmlns=""urn:oasis:names:tc:SAML:2.0:protocol"">
<Issuer xmlns=""urn:oasis:names:tc:SAML:2.0:assertion"">https://abc.xyz/api</Issuer>
<Status>
<StatusCode Value=""urn:oasis:names:tc:SAML:2.0:status:Success"" />
</Status>
</LogoutResponse>";

var doc = new System.Xml.XmlDocument();                
doc.LoadXml(xml);

var nsManager = new XmlNamespaceManager(doc.NameTable);
nsManager.AddNamespace("ns", "urn:oasis:names:tc:SAML:2.0:protocol");

var result = doc.SelectSingleNode("/ns:LogoutResponse/ns:Status/ns:StatusCode/@Value", nsManager).InnerText;
Console.WriteLine(result);

Upvotes: 1

Marc Gravell
Marc Gravell

Reputation: 1062502

Due to the namespaces, this gets a little messy:

var doc = new XmlDocument();
doc.LoadXml(@"<LogoutResponse 
    ID=""_f525259e-7e91-4282-9dc3-a0da65a4a17a""
    Version=""2.0"" 
    IssueInstant=""2021-05-17T15:41:55Z"" 
    InResponseTo=""_5089729f-5cc0-4a66-a3c1-e710cde92897""
    Destination=""https://idp.xyz/logout.aspx"" 
    xmlns=""urn:oasis:names:tc:SAML:2.0:protocol"">
    <Issuer xmlns=""urn:oasis:names:tc:SAML:2.0:assertion"">https://abc.xyz/api</Issuer>
    <Status>
        <StatusCode Value=""urn:oasis:names:tc:SAML:2.0:status:Success"" />
    </Status>
</LogoutResponse>");

var ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("oasis", "urn:oasis:names:tc:SAML:2.0:protocol");
var attr = (XmlAttribute)doc.SelectSingleNode(
    "/oasis:LogoutResponse/oasis:Status/oasis:StatusCode/@Value", ns);
System.Console.WriteLine(attr.Value);

Upvotes: 2

Related Questions