Reputation: 101
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
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
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
Reputation: 169150
Try this:
value3 = element.Descendants("errorMessage").FirstOrDefault()?.Value;
Upvotes: 1