Autor Beitrag
RBS2002
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Sa 03.01.09 00:58 
Hi,

ich möchte in einer XML Datei die wie folgt aussieht

ausblenden 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:

ausblenden 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();
          //XPathNodeIterator iterBooks = navigator.Select("Root/SparkasseNiederlausitz");
          navigator.MoveToChild("Sparkasse",String.Empty);
          navigator.DeleteSelf();
/*          foreach (XPathNavigator nodeBook in iterBooks)
          {
            if(nodeBook.GetAttribute("Titel",String.Empty).Equals(kontenliste.SelectedItem)){

            }
          }*/

        }
      }


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 :D)

und komme nicht weiter....
Würde mich sehr freuen wenn mir jemand weiterhelfen könnte,
mfG
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
2:
var root = XElement.Load(...);
root.Elements("type").Single(child => (string)child.Attribute("Kreditinstitut") == "Sparkasse").Delete();

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Sa 03.01.09 11:40 
user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Sa 03.01.09 16:03 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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.
ausblenden C#-Quelltext
1:
2:
var root = XElement.Load(...);
root.Elements("type").Single(child => (string)child.Attribute("Kreditinstitut") == "Sparkasse").Delete();

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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?


hmmm, er kennt das .single nicht, muss ich da irgendwas einbinden - SharpDevelop hat erstmal nichts vorgeschlagen
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Sa 03.01.09 16:23 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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 :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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 03.01.09 17:22 
user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:
(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.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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 .

user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:
<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.
ausblenden XML-Daten
1:
<Kreditinstitut Name="Sparkasse Niederlausitz" ... />					


user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:
gelöscht hat er aber irgendwie noch nichts...
Abgespeichert hast du es aber nach der Änderung auch ;) ? Oder kommt eine Exception?

_________________
>λ=
RBS2002 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Sa 03.01.09 17:33 
Hallao,

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 03.01.09 22:28 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: So 04.01.09 12:06 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: 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.