Entwickler-Ecke
IO, XML und Registry - XML Kind löschen
RBS2002 - Sa 03.01.09 00:58
Titel: XML Kind löschen
Hi,
ich möchte in einer XML Datei die wie folgt aussieht
XML-Daten
1: 2: 3: 4: 5:
| <?xml version="1.0" encoding="utf-8" ?> - <Root> <titel Titel="Girokonto" Typ="" Kontoinhaber="" Kontonummer="" Bankleitzahl="" Kreditinstitut="" /> <titel Titel="" Typ="" Kontoinhaber="" Kontonummer="" Bankleitzahl="" Kreditinstitut="" /> </Root> |
(Daten wurden entfernt)
jeweils einen Titel löschen (also die ganze Zeile). leider waren meine bisherigen Versuche nicht von Erfolg gekrönt, beim derzeitigen Code sagt er das er es wegen der derzeitigen Position nicht löschen kann. Der Code sieht wie folgt aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| if(kontenliste.SelectedIndex!=-1){ if(MessageBox.Show("Wollen sie das Konto wirklich entfernen?","Abfrage",MessageBoxButtons.YesNo,MessageBoxIcon.Question)==DialogResult.Yes){ XmlDocument document = new XmlDocument(); document.Load("konten.xml"); XPathNavigator navigator = document.CreateNavigator(); navigator.MoveToRoot(); navigator.MoveToChild("Sparkasse",String.Empty); navigator.DeleteSelf();
} } |
Habe mich bisher an folgende Quellen gehalten:
http://msdn.microsoft.com/de-de/library/xws54wwx(VS.80).aspx (und noch eine die ich momentan nicht mehr finde, war aber auch von MS :D)
und komme nicht weiter....
Würde mich sehr freuen wenn mir jemand weiterhelfen könnte,
mfG
jaenicke - Sa 03.01.09 10:05
Als namespaceURI bei MoveToChild gibst du ja einen leeren String an, deine XML-Datei sieht ja in der Hinsicht auch anders aus. Bist du sicher, dass das so korrekt ist? Also dass MoveToChild da auch mit einem leeren String funktioniert?
RBS2002 - Sa 03.01.09 10:18
Da ich leider nicht die XML Kenntnisse habe (wegen Zeitmangel und weil wir als Medizininformatiker dieses Themengebiet leider erst im Master haben), muss ich anhand von Beispielen mein Wissen zusammenschustern, so auch in dem Fall :D
Dort habe ich eine XML Datei gesehen die wie folt aussah:
XML-Daten
1: 2: 3: 4: 5:
| <?xml version="1.0" encoding="utf-8" ?> <books> <book auhtor="Ernest Hemmingway">Fiesta</book> <book author="Unknown">The principles of software development</book> </books> |
Desweiteren hat er folgenden Code als Beispiel angegeben:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private static void NavigateBooks() { XPathDocument docBooks = new XPathDocument("../../Books.xml"); XPathNavigator navBooks = docBooks.CreateNavigator(); XPathNodeIterator iterBooks = navBooks.Select("books/book");
foreach (XPathNavigator nodeBook in iterBooks) { Console.WriteLine("Found book: {0}", nodeBook.Value); Console.WriteLine("Author: {0}", nodeBook.GetAttribute("author", String.Empty)); } } |
Wenn ich das zweite an mein Beispiel anpasse bekomme ich wirklich z.B. den Text der in bei Typ oder Kontonummer steht, beim ersten Beispiel liefert er mir nur einen leeren String....
Kha - Sa 03.01.09 10:36
MoveToChild erwartet den
Tag-Namen, hier also "titel" (wenn es sowieso nur gleiche Tags sind, tut es auch MoveToFirstChild)! Danach prüfst du dann dein Attribut ab und gehst sonst mit MoveToNext weiter zum nächsten titel-Node.
Und ansonsten kann ich nur wiederholen, was ich schon in anderen Threads schrob: Mit XLinq sieht die Welt einfach schöner aus.
C#-Quelltext
1: 2:
| var root = XElement.Load(...); root.Elements("type").Single(child => (string)child.Attribute("Kreditinstitut") == "Sparkasse").Delete(); |
jaenicke hat folgendes geschrieben : |
| Als namespaceURI bei MoveToChild gibst du ja einen leeren String an, deine XML-Datei sieht ja in der Hinsicht auch anders aus. |
In der XML ist doch ebenfalls keiner?
RBS2002 - Sa 03.01.09 11:26
OK, vielen Dank für die Antworten. Werde das heute noch ausprobieren und hoffentlich einen Erfolg melden können. Wegen diesen LINQ - ich habe irgendwo gehört das dies erst mit Version 3 implementiert wurde, stimmt das? Für dieses Programm wäre es nicht wichtig, aber für ein anderes bei dem ich dies in naher Zukunft realisiern möchte wäre das schon entscheidend da dies teilweise auf Windows 2000 Rechnern zum Einsatz kommt und ich dort maximal Version 2 installieren kann. Oder kommt diese auch damit klar?
JüTho - Sa 03.01.09 11:40
RBS2002 hat folgendes geschrieben : |
| Wegen diesen LINQ - ich habe irgendwo gehört das dies erst mit Version 3 implementiert wurde, stimmt das? |
Eindeutiges JA!
Gruß und Frohes Neues Jahr! Jürgen
RBS2002 - Sa 03.01.09 16:03
hmmm, er kennt das .single nicht, muss ich da irgendwas einbinden - SharpDevelop hat erstmal nichts vorgeschlagen
jaenicke - Sa 03.01.09 16:11
Das gibt es aber eigentlich, siehe hier:
http://msdn.microsoft.com/en-us/library/bb920325.aspx
Aber eben nicht bei .NET 2.0, welche Version hast du denn eingestellt? (Weil du das angesprochen hattest.)
(Ich hoffe doch du hast das .single jetzt nur im Post klein geschrieben. ;-))
RBS2002 - Sa 03.01.09 16:23
jaenicke hat folgendes geschrieben : |
Das gibt es aber eigentlich, siehe hier:
http://msdn.microsoft.com/en-us/library/bb920325.aspx
Aber eben nicht bei .NET 2.0, welche Version hast du denn eingestellt? (Weil du das angesprochen hattest.)
(Ich hoffe doch du hast das .single jetzt nur im Post klein geschrieben. ;-)) |
joahr, ich muss mich erst mal an die neue Tastatur gewöhnen :D
aber habe es jetzt sogar mal kopiert und er meldet immer das gleiche. Installiert ist NetFramework 3.5, in den Projektoptionen habe ich auch angegeben das er 3.5 verwenden soll, an sich sollte das also kein Problem sein....
"System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>" enthält keine Definition für "Single", und es konnte keine Erweiterungsmethode "Single" gefunden werden, die ein erstes Argument vom Typ "System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>" akzeptiert (Fehlt eine Using-Direktive oder ein Assemblyverweis?). (CS1061) - D:\Eigene Dateien\SharpDevelop Projects\ebay\ebay\Benutzer.cs:133,27
jaenicke - Sa 03.01.09 16:37
Also ich habe gerade mal nur die beiden Zeilen kopiert, Single wird gefunden. SharpDevelop hab ich nicht da, sonst würde ich es darin testen, aber ob Visual Studio oder das sollte ja eigentlich keinen Unterschied machen, das Framework ist ja das selbe. :gruebel:
Was nicht gefunden wird ist Delete, aber Remove gibt es. Bei Single gibt es aber wie gesagt keinen Fehler.
Ich werde einmal SharpDevelop installieren, es gibt ja immer wieder Fragen, bei denen das verwendet wird. ;-)
RBS2002 - Sa 03.01.09 16:55
hmmm, das ist seltsam - habe gerade das Projekt bei Visual Studio geladen und da ging es erst bei einem neuen Projekt, vorher war dort genau der gleiche fehler.... hmmm, irgendwie seltsam. Aber auch so hat die Funktion nicht das gemacht was ich wollte. Der "Strang" sieht ja so aus:
<SparkasseNiederlausitz Titel="Sparkasse Niederlausitz" Typ="Girokonto" Kontoinhaber="" Kontonummer="" Bankleitzahl="" Kreditinstitut="Sparkasse Niederlausitz" />
Jetzt habe ich die zweite Zeile so lange bearbeitet bis er zu mindestens nicht mehr gemeckert hat das er nichts findet, die sieht wie foltgt aus:
C#-Quelltext
1: 2:
| XElement xe1 = XElement.Load("konten.xml"); xe1.Elements("SparkasseNiederlausitz").Single(child => (string)child.Attribute("Kreditinstitut") == "Sparkasse Niederlausitz").Remove(); |
gelöscht hat er aber irgendwie noch nichts...
Edit:
so, nachdem ich die ganzen usings vom visual studio ins sharpdevelop kopiert habe ging es da "genauso gut" wie unter Visual Studio. Aber, obwohl er anscheinend das Ding findet will er es immer noch nicht löschen...
Kha - Sa 03.01.09 17:22
RBS2002 hat folgendes geschrieben : |
| Wegen diesen LINQ - ich habe irgendwo gehört das dies erst mit Version 3 implementiert wurde, stimmt das? |
Sogar erst 3.5, aber wo 3.0 läuft (>= XP SP2), läuft auch 3.5SP1.
Wenn man XLinq aber unbedingt benutzen will, müsste man mal sehen, wie weit die Mono-Implementierung ist.
RBS2002 hat folgendes geschrieben : |
| (Fehlt eine Using-Direktive oder ein Assemblyverweis?) |
Das ist der springende Punkt ;) . Extension Methods (hier IEnumerable<T>.Single) stehen nur zur Verfügung, wenn die Assembly (System.Core.dll) gelinkt und der Namespace der enthaltenden Klasse (System.Linq.Enumerable) geöffnet ist.
jaenicke hat folgendes geschrieben : |
| Was nicht gefunden wird ist Delete, aber Remove gibt es. |
Uups. Fehler direkt im Beitragseditor sind verzeihlich, aber nicht, wenn man auf dem anderen Bildschirm gerade die Methode nachgeschlagen hat :D .
RBS2002 hat folgendes geschrieben : |
| <SparkasseNiederlausitz Titel="Sparkasse Niederlausitz" Typ="Girokonto" Kontoinhaber="" Kontonummer="" Bankleitzahl="" Kreditinstitut="Sparkasse Niederlausitz" /> |
Das ist doch irgendwie doppelt gemoppelt: Im Tag-Namen und im Attribute steht das gleiche. Tag-Namen sind normalerweise statisch, also z.B.
XML-Daten
1:
| <Kreditinstitut Name="Sparkasse Niederlausitz" ... /> |
RBS2002 hat folgendes geschrieben : |
| gelöscht hat er aber irgendwie noch nichts... |
Abgespeichert hast du es aber nach der Änderung auch ;) ? Oder kommt eine Exception?
RBS2002 - Sa 03.01.09 17:29
was, ich muss das Ding auch noch speichern? :D Sauerei, ich dachte C# ist so mächtig :wink: Naja, mal probieren. (jepp, das wars. Vielen, vielen Dan an alle Helfer. Oh Mann, das man auf sowas nicht kommt, ist ja logisch - arbeite ja mit einem XML Objekt und nicht mit der Datei. Naja, Fehler sind dazu da um gemacht zu werden)
Zu der Erklärung wieso manches doppelt ist (Doppelt gemoppelt): Also das vorne mit den Tag-Namen werde ich noch ändern, da mache ich wahrscheinlich etwas festes rein, bisher war es - da da ja kein Leerzeichen auftreten darf, der gewählte Titel ohne Leerzeichen. Den Rest kann der benutzer frei wählen, das der Titel und das Kreditinstitut gleich ist, ist mehr ein Zufall - hätte auch Kuchen reinschreiben können, ist halt nur für den benutzer zur Orientierung da der Titel danach in der Auswahlliste steht falls er die Kontoangaben noch einmal bearbeiten will. ich hätte bei Titel auch Girokonto beim Programm angeben können.
JüTho - Sa 03.01.09 17:33
Hallao,
Kha hat folgendes geschrieben : |
| Das ist doch irgendwie doppelt gemoppelt: Im Tag-Namen und im Attribute steht das gleiche. Tag-Namen sind normalerweise statisch |
Eigentlich hast Du recht, aber es entspricht auch der BLZ-Datei der Bundesbank: Feld 3 ist die Firmierung lt. Registerauszug bzw. Gesetz oder Satzung. Feld 6 ist eine Kurzbezeichnung des Kreditinstitutes ggf. mit Ort.
Gruß Jürgen
Kha - Sa 03.01.09 22:28
JüTho hat folgendes geschrieben : |
Kha hat folgendes geschrieben : | | Das ist doch irgendwie doppelt gemoppelt: Im Tag-Namen und im Attribute steht das gleiche. Tag-Namen sind normalerweise statisch |
Eigentlich hast Du recht, aber es entspricht auch der BLZ-Datei der Bundesbank: Feld 3 ist die Firmierung lt. Registerauszug bzw. Gesetz oder Satzung. Feld 6 ist eine Kurzbezeichnung des Kreditinstitutes ggf. mit Ort. |
Falls du
das [
http://www.bundesbank.de/download/zahlungsverkehr/bankleitzahlen/20090308/blz_20081208.txt] meinst: Damit habe ich kein Problem. Es ging mir nur darum, dass das eine ungeschickte XML-Struktur ist, besonders beim Erstellen eines XML-Schemas.
JüTho - So 04.01.09 12:06
Ich meinte es in der Tat so. Der Themen-Ersteller hat anscheinend nicht soweit gedacht, wie ich
nach meinem vorigen Beitrag gelesen hatte; insoweit hast Du mit Deiner Kritik natürlich recht. Jürgen
RBS2002 - So 04.01.09 15:03
ja, wenn man noch einmal weiterdenkt weiss man natürlich das die IBAN und BIC Daten für ausländische Kunden fehlen (und soweit ich das mitbekommen habe brauchen die auch die Adresse...). Würde die XML Datei aus heutiger Sicht auch anders aufbauen. Aber wie gesagt, bis vor ein paar Wochen hatte ich gar keine Ahnung von XML - jetzt bin ich erstmal froh das, dass soweit funktioniert.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!