Guten Tag!
Ich habe nun die Aufgabe aus einer XML Datei die Beschreibung und die dazugehörige Regex auszulesen und auf einer Listview darzustellen.
Meine Frage ist folgende, ich habe mir nun eine TestXmlDatei zusammengebastelt die wie folgt aussieht:
<?xml version="1.0" encoding="utf-8" ?>
<item>
<Description>Ich bin eine Beschreibung</Description>
<Regex>Ich bin eine RegEx</Regex>
</item>
<item>
<Description>Ich bin eine Beschreibung1</Description>
<Regex>Ich bin eine RegEx1</Regex>
</item>
<item>
<Description>Ich bin eine Beschreibung2</Description>
<Regex>Ich bin eine RegEx2</Regex>
</item>
<item>
<Description>Ich bin eine Beschreibung3</Description>
<Regex>Ich bin eine RegEx3</Regex>
</item>
Da ich aber vorher noch nie etwas mit XML Dateien zu tun hatte, bin ich mir nicht sicher ob das so überhaupt funzt.
Mein Gedanke ist, dass es mehrere Items gibt, die jeweils eine Description und eine Regex beinhalten. Ist dass oben gezeigt dafür überhaupt richtig?
Und wie kann ich jetzt item für item auslesen und jedes item in einer eigenen zeile anzeigen?
Weiters sollten zum Schluß auch neue Einträge hinzukommen, aber das ist erstmal nicht so wichtig...
hoffe mir kann jemand helfe, wäre euch sehr dankbar
lg
Das dort oben ist kein gültiges XML, ein einfacher Versuch, die Datei mal im Browser zu laden, hätte dir das schon gezeigt. (Es fehlt das Wurzel-Element.)
Prinzipiell würde das so aber funktionieren.
Wie du XML ausliest, ist hier an verschiedenen Stellen bereits ausgiebig erörtert worden. Einfach die Forumssuche nutzen 😃.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Hallo Patzi!
Also ich würde da den XmlReader mal anschauen. Der sollte dir eigentlich ausreichen.
Gruß Partick
Das dort oben ist kein gültiges XML, ein einfacher Versuch, die Datei mal im Browser zu laden, hätte dir das schon gezeigt. (Es fehlt das Wurzel-Element.)
Prinzipiell würde das so aber funktionieren.
Wie du XML ausliest, ist hier an verschiedenen Stellen bereits ausgiebig erörtert worden. Einfach die Forumssuche nutzen 😃.
LaTino
hmm und was darf ich unter einem Wurzelelement verstehen? Ja ich habe es tatsächlich im Browser geöffnet und es hat nicht geklappt 😉
was genau fehtl denn noch?
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Das heißt einfach, dass du ganz am Anfang deiner Datei einen öffnenden Tag einfügst und den dazugehörigen Tag ganz am Ende. Deine Datei könnte z. B. so aussehen:
<?xml version="1.0" encoding="utf-8" ?>
<items>
<item>
<Description>Ich bin eine Beschreibung</Description>
<Regex>Ich bin eine RegEx</Regex>
</item>
<item>
<Description>Ich bin eine Beschreibung1</Description>
<Regex>Ich bin eine RegEx1</Regex>
</item>
<item>
<Description>Ich bin eine Beschreibung2</Description>
<Regex>Ich bin eine RegEx2</Regex>
</item>
<item>
<Description>Ich bin eine Beschreibung3</Description>
<Regex>Ich bin eine RegEx3</Regex>
</item>
</items>
Gruß Patrick
<?xml version="1.0" encoding="utf-8" ?>
<index>
<item>
<Description>Ich bin eine Beschreibung</Description>
<Regex>Ich bin eine RegEx</Regex>
</item>
<item>
<Description>Ich bin eine Beschreibung1</Description>
<Regex>Ich bin eine RegEx1</Regex>
</item>
<item>
<Description>Ich bin eine Beschreibung2</Description>
<Regex>Ich bin eine RegEx2</Regex>
</item>
<item>
<Description>Ich bin eine Beschreibung3</Description>
<Regex>Ich bin eine RegEx3</Regex>
</item>
</index>
Wenn ich das richtig entnommen habe, ist bei mir jetzt "index" dass Wurzelelement, dass um den ganzen text liegen muss... oder sehe ich dass falsch?
Das ist eben nicht die Erklärung, und deshalb habe ich sie auch nicht gegeben. XML ist nur gültig ("wohlgeformt"), wenn es ein (genau ein) äußerstes Element gibt - das Wurzelelement. Ich glaube, dass dir mehr geholfen ist, wenn du dir die Grundlagen selbst aneignest. Der Link, den ich gepostet habe, enthält alle Informationen für einen Schnellstart.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Ich weiß schon, dass ein sauberes XML ein Wurzelelement braucht, aber nach dem du diesen Hinweis schon gegeben hast, habe ich darafu verzichtet.
Gut, ich hätte es auch nochmal erwähnen können bzw. auf dich verweisen.
Aber kann der XmlReader nicht auch nicht valides XML verarbeiten?
Gruß Patrick
Ähm.
Nein.
Ja.
Halb.
Nicht empfehlenswert (der XmlReader sowieso nicht, wer im Himmel auf die Idee kommt, XML sequentiell auszulesen, der frisst auch kleine Kinder).
XDocument oder XmlDocument tun ihren Job so, wie man (meiner Meinung nach) mit XML arbeiten sollte 😄. Ist in diesem Forum ja mehr als einmal erklärt worden, wie die funktionieren 🙂.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Unvalides XML zu verwenden sehe ich auch als eher unempfehlenswert an, aber wenn du XML-Datei von ner fremdsoftware bekommst, dann musst damit leben, was du bekommst.
Ich habe die anforderung so verstanden, dass die XML-Datei ausgelesen werdne muss und sonst nix, dann würde mir persönlich ein Sequenzieller Zugriff reichen. Jetzt hab ichs aber gerade nochmal durchgelesen und gesehen, dass Patzi auch schreiben will. Dann würd ich auch XmlDocument benutzen.
Gruß Patrick
Etwas ausführlicher. Ich halte nicht viel vom sequentiellen (=linearen) Lesen von mehrdimensionalen Daten. Natürlich ist XML eine Textdatei. Aber der ganze Sinn hinter XML ist, Text zu haben, dessen Inhalten man eine Struktur geben kann. Und sequentielles Lesen ignoriert diesen Sinn - wenn ich ein XML habe, das ich am besten sequentiell auslese, dann habe ich eine Textdatei ohne wirkliche Struktur. Dann kann ich auch mit .csv arbeiten, da bin ich besser aufgehoben.
Ein weiterer Sinn von XML besteht darin, universell maschinenlesbar (und nebenbei noch menschenlesbar) zu sein. Grundvoraussetzung ist aber, dass man sich an den Standard hält - sprich: dass das XML wohlgeformt und valide (sind zwei unterschiedliche Sachen) ist. Das Arbeiten mit nicht wohlgeformtem XML vernichtet die Interoperabilität mit einem Schlag. Siehe oben, dann kann ich auch mit Textdateien arbeiten.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Also im 2. Punkt geb ich dir absolut recht. Ich selbst lasse nur XML-Dateien erstellen, die wohlgeformt und valide sind.
Im 1. Punkt, was den Zugriff angeht, möchte ich dir aber wiedersprechen. Wenn ich eine Datei wie im Beispiel gezeigt habe, die ich nur auslesen muss um sie z. B. zu bearbeiten, dazu aber nicht innerhalb der Datei navigieren muss, reicht mir ein sequenzieller Zugriff vollkommen. Allerdings verbaue ich mir damit auch die möglichkeit die Logik oder den Dateiaufbau schnell zu ändern, da ich im schlimmsten Fall zuerst noch komplett vom XmlReader auf z. B. XmlDocument umstellen muss.
Patrick
Wie ich sagte. Wenn das XML Daten wie oben enthält, halte ich CSV für angebrachter.
XmlReader eignet sich dann nur, um ALLE Daten einzulesen. Spätestens, wenn du nur die RegEx mit der Beschreibung "ich bin eine Beschreibung" suchst, bist du bei XmlReader falsch.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Du hast mich inzwischen Überzeugt den XmlReader zu vergesesen.
Hat halt schon seine Vorteile, wenn man mal was ändern muss, wenn man nicht am sequenzeillen zugriff festhängt.
Gruß Patrick
Wie ich sagte. Wenn das XML Daten wie oben enthält, halte ich CSV für angebrachter.
XmlReader eignet sich dann nur, um ALLE Daten einzulesen. Spätestens, wenn du nur die RegEx mit der Beschreibung "ich bin eine Beschreibung" suchst, bist du bei XmlReader falsch.LaTino
Ja genau das ist der Sinn und Zweg der Anwendung, ich suche im Endeffekt zur Beschreibung "Ich bin eine Beschreibung" die zugehörige RegEx.
Und irgendwann sollte man items hinzufügen oder löschen können...
Und wie ich eurer interessanten Diskussion entnommen habe, ist wohl das XMLDocument besser für diese Funktionen...
Nicht empfehlenswert (der XmlReader sowieso nicht, wer im Himmel auf die Idee kommt, XML sequentiell auszulesen, der frisst auch kleine Kinder)
Das sequenzielle Auslesen ist vorallem beim Verarbeiten von großen Xml-Dateien (mehrere 100 MB) wichtig, wo es auf Geschwindigkeit und schonendem Umgang mit Ressourcen drauf ankommt.
In der Zeit, wo XmlDocument oder DataSet die Xml-Datei öffnet, sind die Daten aus der Xml-Datei schon längst in der DB. Vor allem das allokieren von Speicher und die GarbageCollection verlangsamen die Ausführung des Imports enorm.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
Nicht empfehlenswert (der XmlReader sowieso nicht, wer im Himmel auf die Idee kommt, XML sequentiell auszulesen, der frisst auch kleine Kinder)
Das sequenzielle Auslesen ist vorallem beim Verarbeiten von großen Xml-Dateien (mehrere 100 MB) wichtig, wo es auf Geschwindigkeit und schonendem Umgang mit Ressourcen drauf ankommt.
Okay, ich ergänze...wer auf die Idee kommt, [..], um es zu verwerten, der frisst auch kleine Kinder 😉. Hast schon recht - zum puren Laden / Speichern ist XmlReader das Schnellste. Weiterer Vorteil - man muss nicht das komplette Gebilde im Speicher halten. Mit allen Nachteilen, die wieder daran hängen.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
So ich habe es tatsächlich geschafft die XML Datei wie gewünscht auszulesen und in einem Listview darzustellen. Acuh das hinzufügen von neuen Einträgen funktioniert einwandfrei, nur wie zum Teufel lösche ich jetzt Einträge, Google spuckte irgendwas aus, das aber das 3.5 Framework vorraussetzt, ich fahr aber auf den 2.0er....
Die Idee is folgende, in der listview wird ein Element markiert und dann mit einem Kontextmenü gelöscht. gleichzeitig wird das markierte Element im listview in einem String gespeichert und es soll auch aus der XML Datei gelöscht werden. Nur wie?
ich habs zwar irgendwie mit ""SelectSingleNode" und dann mit remove.all() versucht, aber das blieb ohne gewünschten Erfolg... aja meine XML Datei sieht jetzt
so aus:
<?xml version="1.0" standalone="yes"?>
<ITEMS>
<Daten DESCRIPTION="Find 3 digits in a row" REGEX="\d{3}" />
<Daten DESCRIPTION="TEST2" REGEX="2" />
<Daten DESCRIPTION="TEST3" REGEX="3" />
<Daten DESCRIPTION="test" REGEX="REGEX" />
<Daten DESCRIPTION="test" REGEX="REGEX" />
<Daten DESCRIPTION="test" REGEX="REGEX" />
<Daten DESCRIPTION="test" REGEX="REGEX" />
<Daten DESCRIPTION="test" REGEX="REGEX" />
<Daten DESCRIPTION="test" REGEX="REGEX" />
<Daten DESCRIPTION="Hallo" REGEX="ich bin ein test" />
</ITEMS>
So ich habe es jetzt einmal so versucht, aber ich hab ehrlich gesagt keine Ahnung warum das nicht funzt...
XmlDocument doc = new XmlDocument();
doc.Load("text.xml");
XmlNode Daten;
XmlNode root = doc.DocumentElement;
Daten = root.SelectSingleNode("/ITEMS/Daten[DESCRIPTION='TEST3']");
Daten.RemoveAll();
doc.Save("text.xml");
RemoveAll:
Entfernt alle untergeordneten Knoten bzw. Attribute des aktuellen Knotens. (Von XmlNode geerbt.)
Daten.ParentNode.RemoveChild(Daten);
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
So ich habs jetzt so gemacht:
private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
{
if (lstvwLibrary.SelectedItems[0].Text == null)
return;
DeleteEntries(lstvwLibrary.SelectedItems[0].Text);
LoadRegexLibrary();
}
private void DeleteEntries(string strNodeToDelete)
{
XmlDocument d = new XmlDocument();
d.Load(Application.StartupPath + "\\Library.Xml");
XmlNode t = d.SelectSingleNode("/ITEMS/Daten[@DESCRIPTION='"+strNodeToDelete+"']");
t.ParentNode.RemoveChild(t);
d.Save(Application.StartupPath + "\\Library.Xml");
}
Funktioniert einwandfrei 😉
Danke für eure Hilfe!
lg