LINQ to XML NullReferenceException ПОСЛЕ возврата результатов? - PullRequest
0 голосов
/ 02 октября 2009

Я довольно новичок в .NET и, тем более, в LINQ, который я только начал изучать для небольшого проекта, над которым работаю.

У меня есть файл XML, сгенерированный из приложения, которое содержит несколько значений, которые я хочу проанализировать в собственном формате и сохранить в файле.

Я могу заставить один запрос LINQ работать нормально, возвращая значения в мое консольное приложение. Затем выполняется второй запрос, также возвращает запрошенные значения, но затем выдает NRE! Почему он не прекращает итерации по набору результатов после того, как возвращено третье значение?

Во-первых, вот выдержка из файла XML:

<analyse>
   <sample>Leer 12</sample> sample ID and number
   <id>Leer</id>    sample ID
</analyse>
<results>
   <element>
     <name>c</name>
        <value>0.000186156337031958</value>
     </element>
   <element>
     <name>co2</name>
        <value>0.000682099902270885</value>
   </element>
   <element>
     <name>s</name>
        <value>0.000121750914950204</value>
   </element>
   <element>
     <name>so3</name>
        <value>0.000304028592755094</value>
   </element>
</results>

Это первый запрос LINQ:

XDocument uniSample = XDocument.Load(limsfile);

        var analyse = uniSample.Descendants("analyse").Select(el => new
                                                {
                                                    Sample = el.Element("sample").Value,
                                                    Id = el.Element("id").Value
                                                });

        foreach (var el in analyse)
        {
            Console.WriteLine("Sample: " + el.Sample);
            Console.WriteLine("Sample ID: " + el.Id);
        }

Это второй запрос LINQ: (обратите внимание, как мне пришлось переименовывать анонимный тип Value, потому что он как-то конфликтовал)

var results = uniSample.Descendants("element").Select(elements => new 
                                                {
                                                    Name = elements.Element("name").Value,
                                                    Verdi = elements.Element("value").Value
                                                });

        foreach (var el in results)
        {
            Console.WriteLine("Name: " + el.Name);
            Console.WriteLine("Value: " + el.Verdi);
        }

Теперь вывод из программы выглядит так, как вы ожидаете

Sample: Leer 12
Sample ID: Leer
Name: c
Value: 0.000186156337031958
Name: co2
Value: 0.000682099902270885
Name: s
Value: 0.000121750914950204
Name: so3
Value: 0.000304028592755094

... но затем после третьей итерации выдается NRE, указывающее на последний запрос LINQ. Почему он не выходит из цикла foreach, как в первый раз ??

Изменить: На самом деле это после четвертой итерации, извините за путаницу! :) Спасибо!

Ответы [ 3 ]

1 голос
/ 02 октября 2009

Запрос оценивается лениво - он будет выполнять проекцию только после прохождения результатов. Вот почему вы не видите исключение, пока оно не достигнет проблемного элемента. Чтобы заставить запрос оценивать с нетерпением, вы можете позвонить ToList.

Я сильно подозреваю, что у вас есть элемент element, в котором отсутствует подэлемент name или value, поэтому при попытке разыменования свойства Value этого подэлемента вы Вы получаете NullReferenceException в этот момент.

0 голосов
/ 07 октября 2009

Сопротивление преобладает! Я нашел решение в конце концов! так горжусь! : -)

В основном изменились две строки:

XElement uniSample = XElement.Load(limsfile);
...
var results = uniSample.Element("results").Descendants("element").Select(elements => new ...

Так что теперь я загружаю XML в XElement вместо XDocument, это позволило мне более напрямую запрашивать данные ..?

Затем я добавил вызов, чтобы получить потомки «результатов», и это позволяет «прекратить» разбор, когда это необходимо ..: -)

Спасибо за вашу помощь, ребята!

0 голосов
/ 02 октября 2009

Ваш отрывок работает просто отлично. Проблема, вероятно, где-то еще в вашем XML-файле, и наиболее вероятно, что некоторые из ваших элементов не имеют подузла «name» или «value».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...