Benutzer mit den meisten Antworten
Überschreiben von XML-Knoten mit xPath

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
Antworten
-
Hallo,
die Bearbeitung erfolgt wenn du den Weg der Serialisierung nimmst einfach über das deserialisieren Objekt. Aus einer List<T> kannst du beispielsweise einfach Elemente heraus löschen oder neue Einfügen. Auch Eigenschaften kannst du einfach ändern.
Bei einem neuen Serialisierungsprozess werden dann die Daten wieder in die Datei geschrieben.
PS: Im Forum duzen wir uns.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 1. April 2016 11:39
- Als Antwort markiert Aleksander Chalabashiev Mittwoch, 6. April 2016 08:02
Alle Antworten
-
Hallo,
ich vermute mal dass deine XML-Dateien immer den selben Aufbau haben. Warum nutzt du dann keine (De)Serialisierung dafür? Damit würde sich schon alleine dein bisheriger Code extrem verkürzen. Fürs löschen könntest du einfach das jeweilige Element aus der Kind-Auflistung entfernen und ein neues hinzufügen. Alternativ kannst du auch ein vorhandenes Child einfach anpassen. Zum Schluss musst du nur das Objekt neu zu XML serialisieren.
Ein Beispiel für de Serialisierung findest du hier. Beachte auch den am Ende verlinkten 2. Teil.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hallo,
danke für die den Tipp mit (De)Serialization, war mir bisher nicht bekannt.
Der Code ist jetzt gut gekürzt.
Leider finde ich keine Anhaltspunkte zur Bearbeitung von XML-Dateien mit Serialization.
Wie XML-Dateinen erstellt und ausgelesen werden ist gut in Ihrem empfohlenen Link gut erklären, Danke.
Könnten Sie mir bitte noch einen Schubs geben wie ich bestehende Knoten bearbeiten kann?
Gruß -
Hallo,
die Bearbeitung erfolgt wenn du den Weg der Serialisierung nimmst einfach über das deserialisieren Objekt. Aus einer List<T> kannst du beispielsweise einfach Elemente heraus löschen oder neue Einfügen. Auch Eigenschaften kannst du einfach ändern.
Bei einem neuen Serialisierungsprozess werden dann die Daten wieder in die Datei geschrieben.
PS: Im Forum duzen wir uns.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 1. April 2016 11:39
- Als Antwort markiert Aleksander Chalabashiev Mittwoch, 6. April 2016 08:02