LINQ to XML处理重复项

时间:2013-07-25 23:17:19

标签: c# visual-studio-2010 linq-to-xml

我编写了将xml文件中的值加载到textBoxes的方法。

private void load(TreeNodeMouseClickEventArgs e)
{
     XDocument doc = XDocument.Load(@"test.xml");
     string nodeName = e.Node.Text;

     var data = from q in doc.Descendants("dog")
                where (string)q.Attribute("name") == nodeName
                select new Data
                {
                    name = q.Attribute("name").Value,
                    breed = q.Element("breed").Value,
                    sex = q.Element("sex").Value
                };


     foreach (var element in data)
     {
         textBox1.Text = element.name;
         textBox2.Text = element.breed;
         comboBox1.Text = element.sex;
     }
}

只要我不添加具有相同name但不同breed的其他狗,它就能正常工作。我的xml文件如下所示:

<dogs>
<dog name="Mike">
<breed>dachshund</breed>
<sex>true</sex>
</dog>
<dog name="Mike">
<breed>husky</breed>
<sex>true</sex>
</dog>
</dogs>

当我尝试从第二个节点加载值时,没有任何反应,因为之前找到了名为Mike的条目。尝试使用列表,但它没有工作(或者只是我做错了什么)。我想允许那种“重复”,只有1:1重复是forriben(已经写过这部分并且它有效)。如果以获得breed的方式以类似的方式获取name,它将解决问题 - 只需在查询中添加另一个where

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
   nodeName = e.Node.Text;
}

这就是我获得name的方法 - 点击treeView中的所需节点。如果有多个条目名称相同,则仅加载最新条目。所以我的问题是:如何处理?很明显,可以有一只名叫汤姆的狗,品种达克肖德犬和名为汤姆的狗,面包哈士奇犬。

1 个答案:

答案 0 :(得分:1)

使用Tag属性而不是Text属性。

您必须修改填充树的方式,但是您可以将特定对象或值分配给Node.Tag,然后再检索它。这可以包含id或可能包含给定狗的所有信息。然后在treeView1_NodeMouseClick方法中,TreeNodeMouseClickEventArgs e将包含的信息远不仅仅是显示的文字。