LINQ to XML修改现有节点

本文关键字:节点 修改 to XML LINQ | 更新日期: 2023-09-27 18:24:42

我有一个包含节点的TreeView,单击其中一个节点后,数据将从文件加载并填充TextBoxes等。我想防止创建重复项,所以每次textBox"title"包含.xml文件中已经存在的条目时,它都会被删除。我的问题是,第一次点击添加条目的按钮后,一切都很好。但第二次点击后(textBox.Text值不变,所以它将是一个重复的)节点消失了,即使我修改了它。每次双击后,treeView中都会添加新的子节点。我试着自己做,但我没有主意了。

按钮代码:

        private void button1_Click(object sender, EventArgs e)
    {

        XDocument doc = XDocument.Load("test.xml");
        bool ifDuplicate = doc.Descendants("dog")
                        .Any(x => (string)x.Attribute("name") == textBox1.Text);
        if (ifDuplicate == true)
        {
            var xElement = (from q in doc.Elements("dogs").Elements("dog")
                            where q.Attribute("name").Value == textBox1.Text
                            select q);
            foreach (var a in xElement)
                a.Remove();
            doc.Save("test.xml");
            return;
        }
            gender(); //determines in which root node this entry will appear as child node; just comboBox with few exceptions
            TreeViewOperations.SaveTree(treeView1, "test2.xml"); //saving treeView1
            Save("test.xml"); //saving file that contains data form textBoxes etc.
            statusBarUpdate();
    }

所以我的问题是:有没有更好的方法来修改现有节点并删除重复节点?如果需要,也可以附加Load方法。

编辑:保存方法

    private void Save(string filename)
    {
        XDocument database = XDocument.Load(filename);
        XElement dog = new XElement("dog");
        database.Element("dogs").Add(dog);
        dog.Add(new XAttribute("name", textBox1.Text));
        dog.Add(new XElement("breed", comboBox3.Text));
        dog.Add(new XElement("sex", radioButton3.Checked));
        database.Save(filename);
    }

LINQ to XML修改现有节点

我认为您的问题来自if (ifDuplicate)块中的return,因为它阻止了添加新项的方法。

以下是我要使用的解决方案:

private void button1_Click(object sender, EventArgs e)
{
    XDocument doc = XDocument.Load("test.xml");
    // Removes all existing elements
    foreach (XElement xElement in from q in doc.Elements("dogs").Elements("dog")
                                  where q.Attribute("name").Value == textBox1.Text
                                  select q)
        xElement.Remove();
    gender(); //determines in which root node this entry will appear as child node; just comboBox with few exceptions
    TreeViewOperations.SaveTree(treeView1, "test2.xml"); //saving treeView1
    Save("test.xml"); //saving file that contains data form textBoxes etc.
    statusBarUpdate();
}