我有一个格式如下的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文件的问题。
答案 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。在做完上述帖子之后,我没有意识到这一点。