C # Получение элементов из XML-файла - PullRequest
1 голос
/ 09 декабря 2010

У меня есть XML-файл, отформатированный так:

<?xml version="1.0" encoding="utf-8"?>
<Snippets>
  <Snippet name="abc">
    <SnippetCode>
      testcode1
    </SnippetCode>
  </Snippet>

  <Snippet name="xyz">
    <SnippetCode>      
     testcode2
    </SnippetCode>
  </Snippet>

  ...

</Snippets>

Я заполнил список с именем фрагмента, и пока он работает нормально.Например (кстати, я еще не добавил ни одного реального фрагмента), мой список содержит:

abc
xyz
123

Когда я нажимаю на элемент в списке,Я хочу, чтобы код фрагмента этого элемента был вставлен в текстовое поле.Как и при нажатии abc, testcode1 должен быть вставлен в текстовое поле.Я использовал этот код в событии двойного щелчка:

        XDocument doc = XDocument.Load(Application.StartupPath + "\\Snippets.xml");
        foreach (XElement xe in doc.Elements("Snippets").Elements("Snippet"))
        {
            if (listBox1.SelectedItem == xe.Attribute("name"))
            {
            textbox1.Text = xe.Element("SnippetCode").Value;
            }
        }

Однако ничего не вставляется, потому что он никогда не находит значение кода фрагмента.Я добавил MessageBox.Show («тест»);внутри оператора if, чтобы проверить, выполняется ли он, но никогда не выполняется.Выбранное имя элемента списка и имя фрагмента имеют одинаковый текст, поэтому довольно странно, что он никогда не выполняется.

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

Ответы [ 2 ]

1 голос
/ 09 декабря 2010

Вы сравниваете сам атрибут со значением, а не со значением атрибута.

Кроме того, я не могу вспомнить, что это за тип ListBox.SelectedItem, ноесли это object, тогда будет выполнено сравнение ссылок, а не равенство.

string selected = (string) listBox1.SelectedItem;
XDocument doc = XDocument.Load(Application.StartupPath + "\\Snippets.xml");
foreach (XElement xe in doc.Elements("Snippets").Elements("Snippet"))
{
    if (xe.Attribute("name").Value == selected)
    {
        textbox1.Text = xe.Element("SnippetCode").Value;
    }
}

Обратите внимание, что произойдет сбой с исключением, если есть какие-либо фрагменты без атрибута "name".Вероятно, это хорошо, если каждый фрагмент означает , чтобы иметь атрибут name - но если им не позволено, то использовать явное преобразование строки вместо свойства Value просто:

string selected = (string) listBox1.SelectedItem;
XDocument doc = XDocument.Load(Application.StartupPath + "\\Snippets.xml");
foreach (XElement xe in doc.Elements("Snippets").Elements("Snippet"))
{
    if ((string) xe.Attribute("name") == selected)
    {
        textbox1.Text = xe.Element("SnippetCode").Value;
    }
}

Обратите внимание, что вы также можете сделать это через LINQ:

string selected = (string) listBox1.SelectedItem;
XDocument doc = XDocument.Load(Application.StartupPath + "\\Snippets.xml");
string code = doc.Elements("Snippets")
                 .Elements("Snippet")
                 .Where(x => x.Attribute("name").Value == selected)
                 .Select(x => x.Element("SnippetCode").Value)
                 .FirstOrDefault();

if (code != null)
{
    textbox1.Text = code;
}
0 голосов
/ 09 декабря 2010

Я выяснил проблему, xe.Attribute ("name") возвращал name = "abc" вместо просто abc.Мой плохой за то, что не понял этого сразу после написания вышеупомянутого поста.

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