XML-Dateien
-
Hallo Leute,
hab mal eine Frage, wie kann ich eine XML-Datei einlesen wenn ich nicht das Schema kenne. Im Moment muss ich genau die richtige Reihenfolge(Schema) im Programm eingeben, sobald ich diese ändere kann er die XML-Datei nicht mehr einlesen.
Er bricht es mit folgender Fehlermeldung ab:Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in System.Xml.dll aufgetreten. Zusätzliche Informationen: Fehler im XML-Dokument (2,2).
Auf der Seite von msdn zum Thema Schema werde ich nicht ganz schlau raus.
MfG
Hotte
-
Ja, dann zeig mal dein XML Dokument und das Schema!
-
Sobald ich nun zum Beispiel die XML-Struktur ändere kommt die oben beschriebene Fehlermeldung. Eine Grundsätzliche Frage zum einlesen von XML-Dateien, wie kann ich eine XML-Datei einlesen wo ich nicht genau die Struktur/Schema weiß? Hat jedes XML-File ein Schema hinterlegt? Wie kann so ein Schmea erstellt werden, dass alle Programme die XML-Datei einlesen können?
Für jede Antwort bin ich Dankbar.
MfG
Hotte<?xml version="1.0" encoding="utf-8" ?> - <CXML_Samlung xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <Filme> - <CXML_Struktur> <text1>Die Möwe</text1> <text2>Alfred Hitchcock</text2> </CXML_Struktur> - <CXML_Struktur> <text1>Psycho</text1> <text2>Alfred Hitchcock</text2> </CXML_Struktur> </Filme> </CXML_Samlung>
-
Die Struktur ist festgelegt (XML Meta), der Inhalt jedoch nicht.
Das Schema brauchst Du nicht um dein File parsen zu können, sondern um zu überprüfen ob bestimmte Regeln eingehalten wurden. Es ist optional.
Eine Grundsätzliche Frage zum einlesen von XML-Dateien, wie kann ich eine XML-Datei einlesen wo ich nicht genau die Struktur/Schema weiß?
Der Parser bietet dir die Möglichkeit Knoten und Werte zu lesen, etc.
Natülich ist apriori Wissen notwendig (mit oder ohne Schema). Du musst in deim Programm wissen, was Du lesen möchtest und sicherstellen, dass auch das erwartete so ist wie es sein soll.Simon
-
Kanst du mir dann einen Tipp geben wie so ein Code aussehen soll. Ich lese meine XML-Dateien mit der Funktion StreamReader ein und möchte eigentlich mit dieser Funktion beliebige XML-Dateien einlesen ohne die Struktur vorzugeben.
Mein Code:CXML_Filmliste ^temp = gcnew CXML_Filmliste(); StreamReader ^sr = gcnew StreamReader(Speicherort); XmlSerializer ^xs = gcnew XmlSerializer(CXML_Filmliste::typeid); temp = (CXML_Filmliste^) xs->Deserialize(sr); sr->Close();
Mit der Klasse CXML_Filmliste lege ich fest, wie die XML-Datei aufgebaut ist. Nun möchte ich das gerne variable halten und nur nach bestimmten Einträge in der XML Datei suchen.
MfG
Hotte
-
Falls Du keinen guten Grund hast nicht DOM zu verwenden, rate ich dir zu DOM.
Ist (finde ich) komfortabler.Hier der Einstieg:
http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspxIch würde deine Filmliste nicht via Serialize/Deserialize perstisieren.
Simon
-
[quote="theta"]Falls Du keinen guten Grund hast nicht DOM zu verwenden, rate ich dir zu DOM.
Ist (finde ich) komfortabler.Einstig gefunden nur komme ich jetzt nicht weiter:
XML einlesen:
FileStream ^fs = File::OpenRead(Speicherort); XmlReader^xrd = XmlReader::Create(fs); XmlDocument^ doc = gcnew XmlDocument(); doc->Load(xrd); ProcessDom(doc); xrd->Close(); fs->Close();
XML auswerten:
String^ test = test->Empty; XmlNode ^station; XmlElement ^xelem = xd->DocumentElement; station = xelem->SelectSingleNode("/Film/CXML_Struktur/text1/text()"); test = station->Value;
Fehler gefunden: Bei SelectSingleNode die Struktur/Schema mit einbezogen. Ist jetzt korrigiert!
-
Benutze den Debugger und finde heraus warum welche Ref. null ist.
Simon
-
Habe nun noch das Problem, dass ich die XML-Datei nicht richtig durchlaufen kann.
Bei meiner Schleife, erhallte ich immer nur den ersten Wert des ersten Knoten und nicht die anderen Werte. Kann mir vielleicht nochmal jemand helfen?String^ test; test = String::Empty; XmlNode ^station; XmlElement ^xelem = xd->DocumentElement; XmlNodeList^titels = xelem->GetElementsByTagName("text1"); for each (XmlNode^ ti in titels) { station = xelem->SelectSingleNode("/Film/CXML_Struktur/text1/text()"); test = station->Value; ... }
-
Warum iterierst Du über die Titels und holt drinnnen aber trotzdem immer dieselbe Node?
Machs z.B. so:
XmlElement^ docElement = doc->DocumentElement; XmlNodeList^ nodes = docElement->SelectNodes(L"CXML_Samlung/Filme/CXML_Struktur"); for each (XmlNode^ node in nodes) { XmlNode^ text1Node = node->SelectSingleNode(L"text1/text()") String^ text1 = text1Node->Value; }
Simon
-
Mensch ein großes Dankschön schon mal!
MfG
Hotte
-
Habe nochmal eine Frage:
Wie kann ich den Fehler abfangen wenn meine XML-Datei nicht die erforderliche Strucktur aufweißt die ich gerne hätte?// Erstellt eine Liste aller Knoten xmlnodelist = xmlelement->SelectNodes("Filmliste/CXML_Struktur");
MfG
Hotte
-
Nachdem ich so viel Hilfe erhalten habe, hoffe ich nun nochmal so viel Glück zu haben.
Ich habe jetzt die XML Datei eingelesen und in einem DataTable gespeichert.
1. Die habe ich bearbeitet und möchte nun dieses DataTable wieder speichern.
2. In das gleiche XML-File möchte ich zudem eine zweite DataTable speichern.Nur habe ich im Moment mal wieder kein Plan wie das gehen soll, vielleicht kann mir ja jemand helfen?
Mein Versuch:
XmlTextWriter^ writer = gcnew XmlTextWriter("Versuch2.xml", System::Text::Encoding::UTF8); XmlWriterSettings^ setting = gcnew XmlWriterSettings(); setting->Indent = true; writer->WriteString(dtFilmliste->Rows[0]["Filme"]); // Nicht korrekt!
MfG
Hotte
-
Ich würde nicht über DataTable gehen. Du hast überhaupt keine Abstraktion. Da könntest Du gleich bei DOM bleiben.
Machs doch so:
1. XML File via DOM einlesen und in ein geeignetes Objekt Modell abbilden
2. Objekt Modell manipulieren (wobei indirekt der DOM Baum bearbeitet wird)
3. Objekt Modell via DOM wieder speichern.Simon
-
Hallo theta!
Was meinst du mit Objekt Modell?
Ich wollte eigentlich eine Datanbank vermeiden.MfG
Hotte
-
Brauche nochmal eure Hilfe. Möchte mein DOM nun erweitern, aber irgendwie scheitere ich. Ich möchte nun neben dem Film und den Filmtitel dazu die passende Filmlänge einfügen pro Datansatz.
// Neuer Knoten erzeugen XmlNode^ newelem = xmldoku->CreateNode(XmlNodeType::Element,"Filmlänge", nullptr ); //Neuer Wert des Knoten newelem->InnerText = "200 min"; XmlElement^ root = xmldoku->DocumentElement; //XmlNode^ newl = xmldoku->SelectSingleNode("text1/text()"); // ?? root->AppendChild(newelem); // Läuft fügt aber den Knoten am Ende ein //root->InsertAfter(newelem, newl); //Läuft nicht xmldoku->Save("Versuch4.xml");
MfG
Hotte
-
http://lmgtfy.com/?q=c%23+dom+xml
http://www.mastercsharp.com/article.aspx?ArticleID=69&TopicID=9Simon
-
Jo Danke nochmal an theta. Habe es hinbekommen.
Eine gute Seite ist auch:
http://www.microsoft-press.de/chapter.asp?cnt=getchapter&id=ms-091_1.pdf
die ich nach längerem suchen gefunden habe.