XML-Datei parsen oder bestimmte Daten auflisten



  • Grüße euch!

    Ich würde in meiner Windows Forms Anwendung gerne auf ganz bestimmte Werte(Tags) in einer xml-Datei, die online bereitsteht, zugreifen und diese dann in einer Textbox erscheinen lassen. (Ob es nun Windows Forms ist oder nicht macht nichts)

    Ich habe mir dazu schonmal ein paar Infos geholt.

    Z.B. gäbe es da xerces, eine Parserbibliothek etc...

    Was ich jetzt gerne wissen würde ist:

    Wie kann ich bestimmte Bereiche aus einer XML Datei suchen bzw. welche Möglichkeiten gibts hier in C++? Vielleicht geht es ja doch ganz einfach nur die Suche ist mal wieder schwieriger als die Lösung selbst 🙂

    Bitte um ein paar Lösungsansätze oder vielleicht ein kleines Tutorial zum arbeiten mit xml files.

    Ich möchte aber mit C++ arbeiten, nicht mit PHP o.ä. (Ich weis, in PHP gäbe es da extra Funktionen für)

    mfg!



  • Liegt das Problem nun beim Öffnen der Datei aus dem web oder parsen? Falls das zweite zutrifft, da gibt es immer verschiedene Möglichkeiten. Mit C++-std::ifstream dürfte das ne easy Angelegenheit werden. Ich persönlich bevorzuge Standard I/O, man muss zwar die Dateien lexen (whitespaces überspringen etc.), aber es hat den entscheidenden Vorteil, dass es nicht so lahm wie std::ifstream ist. Was ich bei großen Dateien mache, ist alles in einen buffer zu lesen und dann alles bequem zu durchsuchen.



  • Danke dir.

    Es geht mir darum, dass die xml datei online in veränderter form vorliegen kann, d.h. es werden daten ergänzt oder gelöscht.

    Ich möchte folgendes schaffen:

    -xml file abfragen... über browser z.b. in windows forms webbrowser o.ä.
    -dann aus diesem xml file z.B. den Wert zwischen <preis>...<preis> in ein Textfile schreiben lassen

    ich glaube schon dass es sich dann um einen lesenden Parser handeln muss oder?

    mfg



  • Naja, ganz easy. Lädtst die Datei, parset sie und speicherst sie lokal ab. Wie liegt die Datei denn vor? Auf einem FTP-Server, einer Datenbank? Jenachdem wirst du auf eine lib nicht verzichten können.



  • Ok. Genau da liegt das Problem.
    How to parse?

    Welche Möglichkeiten gibts da in C++?



  • Es geht mir darum, dass die xml datei online in veränderter form vorliegen kann, d.h. es werden daten ergänzt oder gelöscht.

    Was denn nun? Du wiedersprichst dich. Geht es nun ums parsing?
    Ich verstehe die Leute nicht, haben solche tollen Ideen, doch schaffen es nicht, zu googlen:
    Klicksdu
    Streams scheinen für deine Vorhaben passend zu sein. Ich persönlich empefehle sie dir aus praktischer und nicht performanter Sicht. C I/O-Operationen rocken ziemlich im Gegensatz zu streams.... Du kannst den ganzen Krempel auch einfach in einen buffer lesen, dass wäre die einfachste Variante.

    Moment mal, dejaveau? Sowas habe ich heute schoneinmal beantwortet. Benutze bitte die Boardsuche!



  • Ok, ich brings mir wieder mal selbst bei.

    Aus diesem Grund habe ich auch noch nicht viele Beiträge. Würde ich jedem Fragestellenden Google empfehlen oder ihm sagen die gleiche Frage gabs schonmal, hätte ich auch 1k Posts...

    Ich glaube meine Fragen waren:

    Was ich jetzt gerne wissen würde ist:

    Wie kann ich bestimmte Bereiche aus einer XML Datei suchen bzw. welche Möglichkeiten gibts hier in C++?

    und

    How to parse?



  • Würde ich jedem Fragestellenden Google empfehlen oder ihm sagen die gleiche Frage gabs schonmal, hätte ich auch 1k Posts...

    Wenn es dem Fragestellendem hilft?

    Wie kann ich bestimmte Bereiche aus einer XML Datei suchen bzw. welche Möglichkeiten gibts hier in C++?

    und

    How to parse?

    beziehen sich auf dasselbe. Wie dem auch sei, es gibt wohl eine vielfalt an Möglichkeiten, wie man eine Datei parset. Da die XML-Datei ASCII-Codiert ist, kannst du die Operation einfach mit einem stream (std::ifstream) durchführen. Um genauer auf "How to parse?" einzugehen:
    -Hole dir per std::ifstream jede Zeile in einen string
    -Überprüfe die ersten Elemente auf bestimmte keywords (zb. <VEC3>)
    -Hole dir die nächsten Daten
    Das war's schon fast. Die Daten die du meistens brauchst, sind Zahlen oder Fließkommawerte, die kannst du bei einem std::string einfach mit ::atof( ) <- float und ::atoi( ) <- integer kovertieren.

    Wenn du es noch ausführlicher haben möchtest, such dir am Besten einen, der es dir gleich programmiert. Außerdem sagte ich bereits: Benutze die Suchmaschine!



  • Die Fage hast du dir doch schon selber beantwortet:
    C++ -> Xerces -> http://xerces.apache.org/xerces-c/

    Wenn du damit zurecht kommst, kannst du auch an diese Sache denken:
    http://xqilla.sourceforge.net/HomePage

    Wenn die Anwendung Schwierigkeiten bereitet, gibt schöne Beispiele in dem Source-Zip zu Xerces. Ansonsten stell deine Frage konkreter. Nach der bisherigen Diskussion wirkt ein "How to parse" wie "Kann mir bitte einer hier ein funktionierendes Beispiel reinstellen, wie ich meine XML-Datei parsen kann". Und sowas wirst du nicht sehen. Da solltest du eigenen Ehrgeiz zeigen und es mal versuchen...



  • Eigenhändig XML zu parsen ist wohl wirklich unnötig, dafür gibt's erprobte Bibliotheken. Je nach deinen Anforderungen reicht TinyXML, das kann halt kein DTD und kein XSL, ist aber ziemlich leichtgewichtig. Xerces ist fetter, kann aber auch mehr. Beide stehen unter lässigen Lizenzen.



  • Kóyaánasqatsi schrieb:

    Da die XML-Datei ASCII-Codiert ist, ...

    Nö, per Default sind die UTF-8, wenn du es nicht anders angibst... Am besten ein Lib verwenden, die gleich damit umgehen kann (->Xerces)



  • Eigenhändig XML zu parsen ist wohl wirklich unnötig, ...

    Ne extra lib für eine XML-Datei? Jedes mal die lib linken und sie durchlaufen lassen? Da ist es performancelastiger mit einer lib zu arbeiten, anstatt es eben selber zu parsen. Und bei diesem Format, ist das wirklich simpel.

    EDIT:
    Keine Ahnung von XML.



  • Ich danke für die regen Beiträge!

    Ok...

    Ich wollte jetzt die WoW Arsenal items auslesen und mir in eine neue Datei schreiben lassen.

    Ich arbeite nun mit der XmlReader Klasse.

    String ^charaktername = Convert::ToString(textBox1->Text);
    String ^servername = Convert::ToString(textBox2->Text);
    
    //in einer Zeile...
    String ^url = "http://eu.wowarmory.com/charactersheet.xml?r=" + servername + "&n=" + charaktername;
    			XmlReaderSettings ^settings = gcnew XmlReaderSettings;
    			settings->ProhibitDtd=false;
    
    			XmlReader ^wowXml = XmlReader::Create(url,settings);
    			while (wowXml->Read())
    			listBox1->Items->Add(wowXml->Value);
                            wowXml->Close();
    

    Unbehandelte Ausnahme:
    "Das erwartete DTD Markup wurde nicht gefunden!"

    Hm... Jetzt weis ich nicht mehr weiter!



  • Weis hier keiner weiter?

    WoW Arsenal mit C++ XmlReader auslesen und bestimmte Items anzeigen...?



  • Das ist doch nicht C++...
    Die Syntax kenn ich nicht, muss irgend was WIndows-Zeugsiges sein. ->falsches Forum.
    Und XmlReader - wo genau kommt die Klasse her? Gibts da keine ordentliche Doku dafür?



  • XmlReader ist eine Klasse aus dem .NET Framework. Die obengezeigte Syntax ist C++/CLI. Also falsches Forum.
    Simon

    Edit:
    Benutze doch die .NET DOM Impl. (XmlDocument, XmlNode, etc.)



  • Alles klar, werde ich mal testen.

    Ja, dass Forum ist für CLI das falsche, aber mir ist es auch egal in welcher Form ich auf das File zugreife, Hauptsache ich erhalte das gewünschte Resultat:

    - Auslesen der WoW Arsenal items.

    Ansonsten bitte ich das Thema in den .NET/CLI Bereich zu verschieben!(Danke)



  • Kannst du mal nen Link zu so nem XML-File posten? WoW Arsenal XML liefert keine brauchbaren Ergebnisse, nur ne Beschwerde, dass die Homepage per XML+XSL-Transformationen dargestellt wird und das den Highspeed-DSL'ern (zu denen ich nicht gehöre) zu langsam ist...



  • Habs jetzt raus!
    Vielen Dank für eure Vorschläge!



  • Kóyaánasqatsi schrieb:

    Eigenhändig XML zu parsen ist wohl wirklich unnötig, ...

    Ne extra lib für eine XML-Datei? Jedes mal die lib linken und sie durchlaufen lassen? Da ist es performancelastiger mit einer lib zu arbeiten, anstatt es eben selber zu parsen.

    Verstehe ich nicht, wieso soll es generell performancelastiger sein? Parsen musst du so oder so und der Code dafür ist dann sowieso in der Executable. Man könnte zwar ein wenig Performance sparen, wenn man das Parsen der Attribute oder bestimmter Kind-Elemente überspringt, aber inwiefern sich der Aufwand dafür lohnt ist fraglich, wenn die XML-Datei nur ein paar KB groß ist und sie vorher aus dem Netz geladen wird.


Anmelden zum Antworten