#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();