首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# xmldataprovider插入节点

C# xmldataprovider插入节点
EN

Stack Overflow用户
提问于 2009-12-31 10:47:17
回答 2查看 1.6K关注 0票数 0

我正在尝试为xml配置文件编写一个编辑器。我将xml文件绑定到一个列表视图,然后选择一个元素,然后单击edit就可以编辑一个元素。当用户单击“保存”时,将调用一个委托来更新xml文档中的元素。我尝试过用不同的方法进行更新,包括appendnode、prependnode、insertafter和替换子节点。我让它们都正常工作,没有任何编译时或运行时错误,但它们不更新xmldataprovider或listview。这可能只是我遗漏了一些简单的东西,但我很难弄清楚它是什么。有人能帮帮忙吗?

谢谢,布赖恩

如果有帮助,下面是我的主窗体(带有listview的窗体)的源代码。

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;
using System.IO;

namespace g2config
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>

    public partial class MainWindow : Window
    {
        public XmlDataProvider dp;
        string cfgfile;
        public managecmpnts manage_components;
        public delegate void managecmpnts(int id, XmlElement component);


        public MainWindow()
        {
            InitializeComponent();
            dp = this.FindResource("configfile") as XmlDataProvider;

            cfgfile = "C:\\Users\\briansvgs\\Desktop\\g2config\\g2config\\bin\\Debug\\g2config.pxml";

            if(Environment.GetCommandLineArgs().Count() > 1)
            {
                string path = Environment.GetCommandLineArgs().ElementAt(1);
                //MessageBox.Show("Path: " + path);
                cfgfile = path;
            }

            if (File.Exists(cfgfile))
            {
                dp.Source = new Uri(cfgfile, UriKind.RelativeOrAbsolute);
            }
            else
            {
                MessageBox.Show("config file not found");
            }

            this.Title = this.Title + " (" + cfgfile + ") ";
        }

        public void browsedir( object sender, EventArgs e)
        {
              System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
            ofd.Filter = "PXML Files (*.pxml)|*.pxml"; ;

            //http://www.kirupa.com/net/using_open_file_dialog_pg4.htm
            if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) //how to browse dirs instead of files?????
            {
                 startpath.Text = ofd.FileName;
            }
        }

        public void newcomponent(object sender, RoutedEventArgs e)
        {            
            componentsettings new_cmpnt = new componentsettings();
            new_cmpnt.Title = "Add Component";
            new_cmpnt.ShowDialog();         
        }

        public void editcomponent(object sender, RoutedEventArgs e)
        {
            int selected = components.SelectedIndex;
            XmlElement current = (XmlElement)components.Items.CurrentItem;
            componentsettings edit_cmpnt = new componentsettings(current);
            edit_cmpnt.cmpnt_mgr.manage_components += new manager.mngcmpnts(test);
            edit_cmpnt.Title = "Edit Component";
            edit_cmpnt.ShowDialog();
        }

        private void browsedir(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.FolderBrowserDialog directory;
            directory = new System.Windows.Forms.FolderBrowserDialog();
            directory.Description = "Please select the folder containing your g2 configuration (pxml) files. Default is C:\\Program Files\\Exacom, Inc.";
            directory.ShowDialog();
            startpath.Text = directory.SelectedPath;
        }

        private void save(object sender, RoutedEventArgs e)
         {
             MessageBox.Show(dp.Source.ToString());

            if(File.Exists(cfgfile + ".old"))
            {
                File.Delete(cfgfile + ".old");
            }

             File.Move(cfgfile, cfgfile + ".old");
             dp.Document.Save(cfgfile);
         }

        private void remove(object sender, RoutedEventArgs e)
        {
            XmlNode component = dp.Document.DocumentElement["Components"].ChildNodes[components.SelectedIndex];
            dp.Document.DocumentElement["Components"].RemoveChild(component);
        }

        private void temp(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(dp.Document.DocumentElement["Components"].ChildNodes[components.SelectedIndex].InnerText.ToString()); //will this give me trouble????? Probably not since it's my config, but...
        }
        private void test(int id, XmlElement testelement)
        {

            //dp.Document.DocumentElement["Components"].ChildNodes[id] = testelement;
            //XmlNode testnode = dp.Document.DocumentElement["Components"].ChildNodes[id + 1];
            //XmlNode testnode = testelement;
            MessageBox.Show(testelement.OuterXml.ToString());
            //dp.Document.DocumentElement["Components"].InsertAfter(dp.Document.DocumentElement["Components"].ChildNodes[0], testelement);
            //dp.Document.DocumentElement["Components"].RemoveChild(testelement);
            //dp.Document.DocumentElement["Components"].ReplaceChild(testnode, dp.Document.DocumentElement["Components"].ChildNodes[id]);
            dp.Document.DocumentElement["Components"].PrependChild(testelement);

            //dp.Document.NodeChanged();

            //dp.Document.DocumentElement["Components"].CloneNode(true);
            dp.Document.DocumentElement["Components"].AppendChild(testelement);
            //dp.Document.
            //MessageBox.Show(dp.Document.OuterXml.ToString());
            //MessageBox.Show(dp.Document.DocumentElement["Components"].FirstChild.AppendChild(testelement).OuterXml.ToString());
        }


    }
}
EN

回答 2

Stack Overflow用户

发布于 2010-01-01 14:42:36

JMSA。谢谢你的建议。我今天一直在玩它,我找到了一个解决方案。它有点乱,但很管用。我复制一个当前节点,然后清除所有的值。如果有人感兴趣,这里有代码。

代码语言:javascript
复制
private void add(object sender, RoutedEventArgs e)
{
    System.Xml.XmlNode test = configfile.Document.DocumentElement["Components"].FirstChild;
    System.Xml.XmlNode testclone = test.Clone();
    for (int i = 0; i < testclone.ChildNodes.Count; i++)
    {
        testclone.ChildNodes[i].RemoveAll();
    }

    configfile.Document.DocumentElement["Components"].AppendChild(testclone);
    components.SelectedItem = components.Items.Count + 1;
}
票数 1
EN

Stack Overflow用户

发布于 2009-12-31 18:20:59

我的建议是使用复合模式为每个元素创建一个类,在类中延迟加载XML文档,并根据需要执行操作。然后再次保存它。不过还是挺多的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1983704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档