последовательность не содержит элементов при разборе XML с использованием Linq - PullRequest
0 голосов
/ 16 января 2012

У меня есть XML Вот так:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <SampleResponse xmlns="http://tempuri.org/">
            <SampleResult>
                <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
                                 xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
                    <NewDataSet xmlns="">
                        <Table diffgr:id="Table1" msdata:rowOrder="0">
                            <tag1>tag1 text</tag1>
                            <tag2>tag2 text</tag2>
                        </Table>
                        <Table diffgr:id="Table2" msdata:rowOrder="1">
                            <tag1>tag1 text</tag1>
                            <tag2>tag2 text</tag2>
                        </Table>
                    </NewDataSet>
                </diffgr:diffgram>
            </SampleResult>
        </SampleResponse>
    </soap:Body>
</soap:Envelope>

здесь я разбираю XML выше, например:

   // My parser Class
    class ParseClass 
    { 
        public string tag1 { get; set; }
        public string tag2 { get; set; }
    }

Мой код синтаксического анализа:

 string XMLresponse = e.response;
    var XResult = XElement.Parse(XMLresponse);
    var result = XResult.Descendants("Table").Select(t => new ParseClass
                 {
                     tag1 = t.Descendants("tag1").First().Value,
                     tag2 = t.Descendants("tag2").First().Value,
                 });
foreach (var res in result1)
                    {
string str=res.tag1;
str=res.tag2;
                    }

Я могу успешно проанализировать XML, если все теги появятся. Но иногда в моем XML-ответе отсутствует тег tag2, в то время я не могу проанализировать XML и выдаю исключение, например «последовательность не содержит элементов» .

Вот мое требование: Я попробовал метод FirstOrDefault вместо метода First, но безрезультатно. если в XML отсутствует какой-либо тег, тогда для этого объекта эта переменная должна иметь значение Null (т. Е. Если тег tag2 отсутствует, то res.tag2 должен быть нулевым). Как мне этого добиться?

1 Ответ

2 голосов
/ 16 января 2012

Вместо использования

tag1 = t.Descendants("tag1").First().Value

использование

tag1 = (string) t.Descendants("tag1").FirstOrDefault()

(И аналогично для tag2.)

FirstOrDefault() вернет null, если значение отсутствует, а преобразование XElement в строку вернет ноль при запросе на преобразование пустой ссылки или текстовое содержимое в противном случае.

...