Получить вложенные элементы с помощью XElement - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь извлечь элемент errorMessage из следующего xml, но получаю сообщение об ошибке, так как, по-видимому, не удается найти тег.Есть идеи, что я сделал не так?Большое спасибо

<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);
}

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

вы не можете получить доступ напрямую к дочернему элементу.Вы должны использовать 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);
    }

Вы также можете использовать GetElementsByTagName.

 value3 = doc.GetElementsByTagName("errorMessage");

Он вернет коллекцию узлов, которая включает "errorMessage"

0 голосов
/ 06 июня 2018

Для VB'еров, которые могут столкнуться с этим ...

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
0 голосов
/ 05 июня 2018

Попробуйте это:

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