| Autor |
Beitrag |
RBS2002
      
Beiträge: 57
|
Verfasst: Sa 03.01.09 00:58
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:
msdn.microsoft.com/d...xws54wwx(VS.80).aspx (und noch eine die ich momentan nicht mehr finde, war aber auch von MS  )
und komme nicht weiter....
Würde mich sehr freuen wenn mir jemand weiterhelfen könnte,
mfG
|
|
jaenicke
      
Beiträge: 19338
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 57
|
Verfasst: 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
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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 57
|
Verfasst: 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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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 
      
Beiträge: 57
|
Verfasst: Sa 03.01.09 16:03
|
|
jaenicke
      
Beiträge: 19338
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 03.01.09 16:11
Das gibt es aber eigentlich, siehe hier:
msdn.microsoft.com/e...ibrary/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 
      
Beiträge: 57
|
Verfasst: Sa 03.01.09 16:23
jaenicke hat folgendes geschrieben : | Das gibt es aber eigentlich, siehe hier:
msdn.microsoft.com/e...ibrary/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
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
      
Beiträge: 19338
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
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 
      
Beiträge: 57
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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  .
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 
      
Beiträge: 57
|
Verfasst: Sa 03.01.09 17:29
was, ich muss das Ding auch noch speichern?  Sauerei, ich dachte C# ist so mächtig  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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Sa 03.01.09 22:28
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: So 04.01.09 12:06
Kha hat folgendes geschrieben : | | Falls du das meinst: Damit habe ich kein Problem. Es ging mir nur darum, dass das eine ungeschickte XML-Struktur ist, besonders beim Erstellen eines XML-Schemas. |
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 
      
Beiträge: 57
|
Verfasst: 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.
|
|
|