Загрузить XML-файл в многомерный массив

#c# #xml #multidimensional-array #linq-to-xml

#c# #xml #многомерный-массив #linq-to-xml

Вопрос:

Я рву на себе волосы, пытаясь прочитать XML-файл в двумерный массив. Я действительно не знаю, почему появляется ошибка. На самом деле я еще даже не выполнил часть массива. XML-файл выглядит следующим образом:

 <?xml version="1.0" encoding="UTF-8"?>

-<TERMINAL_MESSAGE_FILE>
    -<MESSAGE>
        <LABEL>LABEL1</LABEL>
        <MSG>MESSAGE1</MSG>
    </MESSAGE>
    -<MESSAGE>
       <LABEL>LABEL2</LABEL>
       <MSG>MESSAGE2</MSG>
    </MESSAGE>
</TERMINAL_MESSAGE_FILE>
 

Все значения элементов берутся из массива messageArray[2]. Возможно, я не создаю это правильно, поскольку я новичок в XML.

Теперь я получаю имя файла из элемента управления диалогового окна файла. Вот код, который я использую:

     class message
     {
       public string _label{ get; set; }
       public string _message{ get; set; }
     }

public partial class messageForm : Form
{
    InitializeComponent();
}

private loadBTN_Click(object sender, EventArgs e)
{
    DialogResult result = openMsgFD.ShowDialog();

    if (result == DialogResult.OK)
    {
        XDocument doc = XDocument.Load(openMsgFD.FileName);

        var settingsList = (from element in doc.Root.Elements("MESSAGE")
                           select new message
                           {
                                _label = element.Attribute("LABEL").Value,
                                _message= element.Attribute("MESSAGE").Value

                            }).ToList();

    // will need to deal with putting this into the array but I haven't got that far yet.
    }
}
 

Итак, ошибка, которую я получаю, звучит так: «Ссылка на объект не установлена для экземпляра объекта».
Дело в том, что я скопировал этот код из многочисленных примеров, которые я видел, и некоторые немного отличаются, но я всегда получаю эту ошибку. Я пытался использовать StreamReader и StreamWriter, но в MESSGAE.VALUE есть возврат каретки, поэтому я не могу заставить это работать.
Любая помощь будет высоко оценена. Спасибо, Том

Комментарии:

1. LABEL и MSG являются дочерними элементами , а не атрибутами элемента MESSAGE.

2. Просто из любопытства, почему многомерный массив? Почему бы не использовать collection ( List<T> ) объектов из LINQ? Если метка уникальна, вы можете использовать словарь с меткой в качестве ключа и сообщением в качестве значения.

Ответ №1:

Как я намекнул в комментарии, LABEL и MSG являются элементами, а не атрибутами.

Во-первых, я бы переопределил message, как показано ниже — в идиоматическом C # классы и свойства PascalCased:

 public class Message
{
    public string Label { get; set; }
    public string Msg { get; set; }
}
 

Тогда этот XLinq должен работать:

 var settingsList = (from element in doc.Root.Elements("MESSAGE")
                    select new Message
                    {
                        Label = (string)element.Element("LABEL"),
                        Msg = (string)element.Element("MSG")

                    }).ToList();