none
Überschreiben von XML-Knoten mit xPath RRS feed

  • Frage

  • Hallo,

    ich möchte für lange XML-Dokumente einen Editor in C# erstellen.
    Das XML Dokument ist in vier Ebenen aufgeteilt (Parent, Child, ChildChild. ChildChilChild).
    Über drei Dropboxen kann ich zu einem gewünschten ChildChild-Unterknoten navigieren und dessen Inhalt (ChildChildChild-Knoten) in einem Textfenster anzeigen lassen. Diese Funktion ist bereits gegeben (folgende C# Funktionen).

    private void UpdateListOfScripts(string p_sPath)
            {
                System.IO.DirectoryInfo ParentDirectory = new System.IO.DirectoryInfo(p_sPath);
    
                comboBoxScript.Items.Clear();
                foreach (System.IO.FileInfo f in ParentDirectory.GetFiles())
                {
                    if(f.ToString().ToLower().EndsWith(".xml"))
                    {
                        string fileNoExtension = f.Name.Replace(".xml", "");
                        comboBoxScript.Items.Add(fileNoExtension);
                    }
                }
                comboBoxScript.AutoCompleteMode = AutoCompleteMode.Suggest;
                comboBoxScript.AutoCompleteSource = AutoCompleteSource.ListItems;
                comboBoxScript.SelectedIndex = 0;
            }        
    
            private void ReadChilds(string p_sPath)
            {            
                try
                {
                    XmlTextReader reader = new XmlTextReader(p_sPath);
                    XPathDocument xPathDoc = new XPathDocument(reader);
                    XPathNavigator navigator = xPathDoc.CreateNavigator();
    
                    navigator.MoveToFirstChild();
                    XPathNodeIterator iterator = navigator.Select("//Child/@Name");
    
                    comboBoxChild.Items.Clear();
    
                    while (iterator.MoveNext())
                    {
                        comboBoxChild.Items.Add(iterator.Current.Value);                                       
                    }
                    comboBoxChild.SelectedIndex = 0;
                                        
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
    
            private void ReadChildChilds(string p_sPath)
            {
                try
                {
                    XmlTextReader reader = new XmlTextReader(p_sPath);
                    XPathDocument xPathDoc = new XPathDocument(reader);
                    XPathNavigator navigator = xPathDoc.CreateNavigator();
    
                    m_sXPath = "//Child[@Name = '" + comboBoxChild.SelectedItem + "']/ChildChild/@Name";
                    XPathNodeIterator iterator = navigator.Select( m_sXPath);
    
                    comboBoxChildChild.Items.Clear();
    
                    while (iterator.MoveNext())
                    {
                        comboBoxChildChild.Items.Add(iterator.Current.Value);
                    }
                    comboBoxChildChild.SelectedIndex = 0;
    
    
                    ReadClearText();
    
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
    
            private void ReadClearText(p_sPath)
            {
                XmlTextReader reader = new XmlTextReader(p_sPath);
                XPathDocument xPathDoc = new XPathDocument(reader);
                XPathNavigator navigator = xPathDoc.CreateNavigator();
    
                m_sXPath = "//Child[@Name = '" + comboBoxChild.SelectedItem + "']/ChildChild[@Name='" + comboBoxChildChild.SelectedItem + "']";
    
                XPathNodeIterator iterator = navigator.Select(m_sXPath);
    
                textBoxClearText.Clear();
    
                while (iterator.MoveNext())
                {
                    textBoxClearText.Text += iterator.Current.InnerXml + "\r\n";
                }
     
            }

    Die im Textfeld ausgegebenen ChildChildChild-Knoten möchte ich nun editieren und zurück ins XML-Dokument schreiben.
    Jedoch fehlen mir die passenden Funktionen.

    Als erstes müsste ich doch alle ausgelesenen orginalen ChildChildChild-Knoten im XML-Dokument löschen.
    Als zweites würde ich dann den gesamten Text (editierte ChildChildChild-Knoten) aus der TextBox in mein XML-Dokument in den ChildChild-Knoten schreiben. 
    Ich hänge leider schon beim Thema löschen :(.
    Zu diesem Thema habe ich die Methode DeleteSelf() genommen und erhalte die Fehlermeldung "Die angegebene Methode wird nicht unterstützt."

    private void WriteToXML(p_sPath)
            {
                XmlTextReader reader = new XmlTextReader(p_sPath);
                XPathDocument xPathDoc = new XPathDocument(reader);
                XPathNavigator navigator = xPathDoc.CreateNavigator();
    
                m_sXPath = "//Child[@Name = '" + comboBoxChild.SelectedItem + "']/ChildChild[@Name='" + comboBoxChildChild.SelectedItem + "']";
    
                XPathNodeIterator iterator = navigator.Select(m_sXPath);
    
                iterator.Current.DeleteSelf();
                
            }

    Hat jemand einen Tipp wo mein Fehler liegt bzw. wie ich mein Vorgehen optimieren kann?

    Grüße

      
    • Bearbeitet magkro Donnerstag, 24. März 2016 10:41
    Donnerstag, 24. März 2016 10:41

Antworten

Alle Antworten