| Autor |
Nachricht |
Hotte
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.06.2009
Beiträge: 38
|
Hotte Mitglied
15:50:14 08.02.2010 Titel: |
XML-Dateien |
Zitieren |
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:
| C++/CLI: | Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in System.Xml.dll aufgetreten.
Zusätzliche Informationen: Fehler im XML-Dokument (2,2).
| |
| C++/CLI: | Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in System.Xml.dll aufgetreten.
Zusätzliche Informationen: Fehler im XML-Dokument (2,2).
| |
| C++/CLI: | 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 |
|
|
|
 |
theta
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 3648
|
theta Mitglied
16:23:44 08.02.2010 Titel: |
|
Zitieren |
Ja, dann zeig mal dein XML Dokument und das Schema! |
|
|
|
 |
Hotte
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.06.2009
Beiträge: 38
|
Hotte Mitglied
07:47:42 09.02.2010 Titel: |
Die XML-Datei |
Zitieren |
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
| HTML Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <?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>
| |
| HTML Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <?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>
| |
| HTML Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 | <?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>
| |
|
|
|
|
 |
theta
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 3648
|
theta Mitglied
08:57:21 09.02.2010 Titel: |
|
Zitieren |
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.
| Zitat: | | 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 |
|
|
|
 |
Hotte
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.06.2009
Beiträge: 38
|
Hotte Mitglied
09:27:17 09.02.2010 Titel: |
|
Zitieren |
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:
| C++/CLI: | 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();
| |
| C++/CLI: | 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();
| |
| C++/CLI: | 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 |
|
|
|
 |
theta
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 3648
|
theta Mitglied
10:08:42 09.02.2010 Titel: |
|
Zitieren |
|
 |
Hotte
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.06.2009
Beiträge: 38
|
Hotte Mitglied
12:21:42 09.02.2010 Titel: |
|
Zitieren |
[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:
| C++/CLI: | FileStream ^fs = File::OpenRead(Speicherort);
XmlReader^xrd = XmlReader::Create(fs);
XmlDocument^ doc = gcnew XmlDocument();
doc->Load(xrd);
ProcessDom(doc);
xrd->Close();
fs->Close();
| |
| C++/CLI: | FileStream ^fs = File::OpenRead(Speicherort);
XmlReader^xrd = XmlReader::Create(fs);
XmlDocument^ doc = gcnew XmlDocument();
doc->Load(xrd);
ProcessDom(doc);
xrd->Close();
fs->Close();
| |
| C++/CLI: | 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:
| C++/CLI: | String^ test = test->Empty;
XmlNode ^station;
XmlElement ^xelem = xd->DocumentElement;
station = xelem->SelectSingleNode("/Film/CXML_Struktur/text1/text()");
test = station->Value;
| |
| C++/CLI: | String^ test = test->Empty;
XmlNode ^station;
XmlElement ^xelem = xd->DocumentElement;
station = xelem->SelectSingleNode("/Film/CXML_Struktur/text1/text()");
test = station->Value;
| |
| C++/CLI: | 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! |
Zuletzt bearbeitet von Hotte am 12:30:08 09.02.2010, insgesamt 1-mal bearbeitet |
|
 |
theta
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 3648
|
theta Mitglied
12:25:34 09.02.2010 Titel: |
|
Zitieren |
Benutze den Debugger und finde heraus warum welche Ref. null ist.
Simon |
|
|
|
 |
Hotte
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.06.2009
Beiträge: 38
|
Hotte Mitglied
12:48:00 09.02.2010 Titel: |
|
Zitieren |
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?
| C++/CLI: | 1 2 3 4 5 6 7 8 9 10 11 12 | 1 2 3 4 5 6 7 8 9 10 11 12 | 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;
...
}
| |
| C++/CLI: | 1 2 3 4 5 6 7 8 9 10 11 12 | 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;
...
}
| |
| C++/CLI: | 1 2 3 4 5 6 7 8 9 10 11 12 | 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;
...
}
| |
|
|
|
|
 |
theta
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 3648
|
theta Mitglied
13:49:33 09.02.2010 Titel: |
|
Zitieren |
Warum iterierst Du über die Titels und holt drinnnen aber trotzdem immer dieselbe Node?
Machs z.B. so:
| C++/CLI: | 1 2 3 4 5 6 7 8 | 1 2 3 4 5 6 7 8 | 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;
}
| |
| C++/CLI: | 1 2 3 4 5 6 7 8 | 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;
}
| |
| C++/CLI: | 1 2 3 4 5 6 7 8 | 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 |
|
|
|
 |