user552769
user552769

Reputation: 101

Get Nested Elements using XElement

I'm trying to extract the errorMessage element from following xml but getting an error as it seemingly cannot find the tag. Any ideas what I've done wrong? Many thanks

<order>
<orderReference>ABCD</orderReference>
<status>Error</status>
<errors>
<error>
  <errorCode>1102</errorCode>
  <errorMessage><![CDATA[ "Job with same reference already exists in      file" ]]></errorMessage>
</error>
</errors>

foreach (XElement element in doc.Descendants("order"))
{
    string value = element.Element("orderReference").Value;
    string value2 = element.Element("status").Value;
    string value3 = "";
    if (value2 == "Error")
    {
        value3 = element.Element("errorMessage").Value;
    }

    Console.WriteLine(value + ' ' + value2 + ' ' + value3);
}

Upvotes: 1

Views: 3708

Answers (3)

dbasnett
dbasnett

Reputation: 11773

For VB'ers that might come across this...

Dim xe As XElement
'to load
'  xe = XElement.Load("path / URI")
'for testing
xe = <order>
         <orderReference>ABCD</orderReference>
         <status>Error</status>
         <errors>
             <error>
                 <errorCode>1102</errorCode>
                 <errorMessage><![CDATA[ "Job with same reference already exists in      file" ]]></errorMessage>
             </error>
         </errors>
     </order>

'get first
Dim errMess As String = xe...<errorMessage>.FirstOrDefault.Value

'get ALL <errorMessage> elements
Dim ie As IEnumerable(Of XElement) = xe...<errorMessage>

For Each el As XElement In ie
    Debug.WriteLine(el.Value)
Next

Upvotes: 0

Saeed Bolhasani
Saeed Bolhasani

Reputation: 580

you can't access directly to a child element. you should use XPATH : errors/error/errorMessage

foreach (XElement element in doc.Descendants("order"))
  {
        string value = element.Element("orderReference").Value;
        string value2 = element.Element("status").Value;
        string value3 = "";
        if (value2 == "Error")
        {
            value3 = element.Element("errors/error/errorMessage").Value;

        }

        Console.WriteLine(value + ' ' + value2 + ' ' + value3);
    }

You can also use GetElementsByTagName.

 value3 = doc.GetElementsByTagName("errorMessage");

It will return collection of nodes that includes "errorMessage"

Upvotes: 0

mm8
mm8

Reputation: 169150

Try this:

value3 = element.Descendants("errorMessage").FirstOrDefault()?.Value;

Upvotes: 1

Related Questions