C#从xml文件中获取元素

时间:2010-12-09 07:08:11

标签: c# xml insert listbox

我有一个格式如下的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(“test”);在if语句中检查它是否执行但它永远不会执行。选定的列表框项目名称和片段名称具有相同的文本,因此很奇怪它不会执行。

有谁知道我的代码出了什么问题?另外,有没有人知道从片段元素在文档中插入文本更好的主意?此方法可能不太好,因为性能可能是大型XML文件的问题。

2 个答案:

答案 0 :(得分:1)

您将属性本身与值进行比较,而不是属性的值。

此外,我不记得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;
}

答案 1 :(得分:0)

我想出了问题,xe.Attribute(“name”)返回name =“abc”而不是abc。在做完上述帖子之后,我没有意识到这一点。