【问题标题】:C# Getting elements from an xml fileC# 从 xml 文件中获取元素
【发布时间】:2010-12-09 07:08:10
【问题描述】:

我有一个格式如下的 XML 文件:

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

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

  ...

</Snippets>

我已经用 sn-p 名称填充了一个列表框,到目前为止它工作正常。例如(顺便说一句,我还没有添加任何真正的 sn-ps),我的列表框包含:

abc
xyz
123

当我单击列表框中的某个项目时,我希望将该项目的 sn-p 代码插入到文本框中。就像单击 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;
            }
        }

但是,没有插入任何内容,因为它从未找到 sn-p 代码值。我添加了一个 MessageBox.Show("test");在 if 语句中检查它是否执行但它永远不会执行。选中的列表框项目名称和 sn-pname 具有相同的文本,所以它从来没有执行过很奇怪。

有人知道我的代码有什么问题吗?另外,有没有人知道从 sn-p 元素在文档中插入文本的更好主意?这种方法可能不太好,因为大型 XML 文件的性能可能是个问题。

【问题讨论】:

    标签: c# xml insert listbox


    【解决方案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;
        }
    }
    

    请注意,如果有任何没有“名称”属性的 sn-ps,这将失败并出现异常。如果每个 sn-p 意味着都有一个 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;
    }
    

    【讨论】:

    • 是的,我现在才意识到这一点。
    • 刚刚测试了第二段代码,它可以工作,谢谢。我犯了一个愚蠢的错误。
    【解决方案2】:

    我发现了问题所在,xe.Attribute("name") 返回的是 name="abc" 而不仅仅是 abc。我在发完上述帖子后没有意识到这一点,这很糟糕。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 2018-08-06
      • 2021-10-21
      • 1970-01-01
      相关资源
      最近更新 更多