2009-12-31 5 views
0

xml 구성 파일 용 편집기를 작성하려고합니다. xml 파일을 listview에 바인딩하고 요소를 선택한 다음 편집을 클릭하면 요소를 편집 할 수 있습니다. 사용자가 저장을 클릭하면 xml 문서 내의 요소를 업데이트하는 대리자가 호출됩니다. appendnode, prependnode, insertafter 및 child 대체 등 다양한 방법으로 업데이트를 시도했습니다. 나는 컴파일 타임이나 런타임 에러없이 모든 작업을 할 수 있었지만 xmldataprovider 나 listview는 업데이트하지 않았다. 그것은 아마도 내가 누락 된 단순한 무언가이지만, 그것이 무엇인지 알아내는 데 어려움을 겪고 있습니다. 누군가 도와 주실 수 있습니까? 도움이된다면C# xmldataprovider 삽입 노드

감사합니다, 브라이언

, 여기 내 기본 폼 (목록보기로 하나)의 소스 코드의

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()); 
     } 


    } 
} 

답변

0

나의 제안은 각 요소에 의해 클래스를 생성하는 것입니다 합성 패턴을 사용하여 클래스의 XML 문서를 게으른로드하고 필요에 따라 작업을 수행합니다. 그런 다음 다시 저장하십시오. 꽤 소수.

1

JMSA. 제안 해 주셔서 감사합니다. 나는 오늘 그걸 가지고 놀고 있었고 해결책을 찾았습니다. 조금 지저분하지만 작동합니다. 현재 노드 중 하나를 복사 한 다음 모든 값을 지 웁니다. 관심있는 사람이 있다면 여기에 코드가 있습니다.

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; 
}