XML файл при чтении выдаёт ошибку

133
30 декабря 2020, 07:10

Пытаюсь прочитать XML файл.

XmlDocument doc = new XmlDocument();
doc.Load(filePath);
XmlNodeList cellList = doc.SelectNodes("//Row/Cell");
foreach (XmlNode node in cellList);
            {
                string iNumber = cellList[0].Attributes[0].Value;
                string iAccountNumber = cellList[1].Attributes[0].Value;
                string name = cellList[2].Attributes[0].Value;

При запуске выдаёт ошибку: System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта." указывая на строку:

string iNumber = cellList[0].Attributes[0].Value;

Что делаю не так подскажите пожалуйста.

Вот фрагмент из xml файла. Перед этим фрагментом много информации с совершенно разными тегами, которые не нужно читать.

<Row>
    <Cell ss:StyleID="s69"><Data ss:Type="Number">1</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="Number">340054288</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="String">ИВАНОВ  К. С.</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="String">НОВОСТРОЙКА  28 ГА</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="Number">271</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="String">108.8200</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="String">2015-061195</Data></Cell>
    <Cell ss:StyleID="s69"><Data ss:Type="String">DDS 232</Data></Cell>
    <Cell ss:StyleID="s70"><Data ss:Type="DateTime">2017-09-05T00:00:00.000</Data></Cell>
   </Row>

Элементов с тегом Row много в файле, именно их нужно читать.

Answer 1

Точно сказать почему происходит ошибка я не могу, но хочу отметить несколько моментов:

Точка с запятой

У Вас точка с запятой после foreach, уберите ее:

foreach (XmlNode node in cellList); --вот

Из-за нее цикл работает в пустую, а все, что идет после цикла, считается отдельным блоком и к циклу не относится. Соответственно, даже если не будет найдено ни одной ячейки код будет обращаться к cellList[0].

Обычно среда разработки подчеркивает или как-то выделяет лишние символы в таких случаях, обращайте внимание на такие подсказки.

cellList[0] вернет null для пустого списка

Для пустого списка cellList[0] как это ни странно не выкинет исключение, а вернет null, о чем написано в документации XmlNodeList:

The XmlNode with the specified index in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.

Не находятся ячейки

Из вышесказанного следует, что по каким-то причинам SelectNodes возвращает пустой результат. Чтобы мы могли точно определить почему Вам нужно создать воспроизводимый пример, а именно выложить XML-файл на котором ошибка воспроизводится.

Вот фрагмент из xml файла. Перед этим фрагментом много информации с совершенно разными тегами, которые не нужно читать.

В этом случае лучше будет сделать так: удалить из XML файла «много информации» как перед так и после этого фрагмента, оставить только корневой элемент и проверить воспроизводится ли ошибка на таком файле. Если не воспроизводится, то значит дело как раз в удаленной части и нужно разбираться с ней. Если воспроизводится, то у Вас получится минимальный, но при этом полноценный, пример, который можно выложить в вопросе. И на нем уже будет видно в чем именно ошибка.

Answer 2

Не могу определить почему у Вас не работает, но нижеприведённый код, основанный на Ваших данных, отрабатывает без проблем:

using System;
using System.Xml;
public class Program {
    public static void Main() {
        string xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
        xmlString += "<rootNode xmlns:ss=\"http://www.w3.org/2001/XMLSchema-instance\">";
        xmlString += "<Row>";
        xmlString += "<Cell ss:StyleID=\"s69\"><Data ss:Type=\"Number\">1</Data></Cell>";
        xmlString += "<Cell ss:StyleID=\"s69\"><Data ss:Type=\"Number\">340054288</Data></Cell>";
        xmlString += "<Cell ss:StyleID=\"s69\"><Data ss:Type=\"String\">ИВАНОВ К. С.</Data></Cell>";
        xmlString += "<Cell ss:StyleID=\"s69\"><Data ss:Type=\"String\">НОВОСТРОЙКА  28 ГА</Data></Cell>";
        xmlString += "</Row>";
        xmlString += "</rootNode>";
        XmlDocument doc = new XmlDocument();
                    doc.LoadXml(xmlString);
        XmlNode root = doc.DocumentElement;
        using(XmlNodeList nodeList = root.SelectNodes("//Row/Cell")){
            foreach(XmlNode node in nodeList){
                Console.WriteLine("innerText: " + node.InnerText + 
                ", argument[0]: " + node.Attributes[0].Value);
            }
        }
    }
} 

Выводит

innerText: 1, argument[0]: s69
innerText: 340054288, argument[0]: s69
innerText: ИВАНОВ К. С., argument[0]: s69
innerText: НОВОСТРОЙКА  28 ГА, argument[0]: s69

Поиграться можно здесь.

Ссылки по теме

  • XmlDocument
  • XmlDocument.DocumentElement
  • XmlNode
  • XmlNode.SelectNodes
READ ALSO
Как удалить привязки DataGridViewComboBoxCell из dataGridView?

Как удалить привязки DataGridViewComboBoxCell из dataGridView?

Нужно сделать сброс dataGridView1 в начальное состояние, те удалить все строки и вставить новые изначальные

125
Принципы ООП в С# [закрыт]

Принципы ООП в С# [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах

119
MySql большое количество Rows examined

MySql большое количество Rows examined

У меня вопрос к спецам по MySqlВ логе медленных запросов есть вот такой запрос:

124
Группировка сообщений в MySql-запросе

Группировка сообщений в MySql-запросе

Прошу помощи в создании запросаНеобходимо при выборке сообщений с базы данных сгруппировать их

132