Elemente aus Xml-Datei extrahieren und in txt-Datei speichern



  • Hallo,
    ich brauche dringend Hilfe.
    Ich würde gerne aus einer Xml-Datei mittels C++ bestimmte Elemente extrahieren. Also es soll nach einem bestimmtem Schlagwort gesucht werden und anschließend alles, was nach dem Schlagwort in Anführungszeichen steht in einer txt-Datei gespeichert werden.

    Das Einlesen der xml-Datei und die Ausgabe in einer txt-Datei habe ich hinbekommen, allerdings bereitet mir der Rest Schwierigkeiten. 😕

    Ich hoffe jemand kann mir weiterhelfen 🙂

    Dankeschön im Vorraus! 👍


  • Mod

    Bist du sicher, dass du die Problemstellung richtig verstanden hast? Volltextsuche im XML-Format geht irgendwie am Sinn von XML vorbei 😕

    Ansonsten: Die Daten liegen dir doch sicherlich als irgendeine Art String vor. string::find?



  • Vielleicht hab ich mich ein bisschen zu unverständlich ausgedrückt! 😃
    Habe es aber endlich hinbekommen.
    Zuerst die XML Datei Zeilenweise einlesen und dann mit einer while Schleife auf den bestimmten Ausdruck für Start- und Endpunkt untersuchen.
    Anschließend noch die jeweilige Zeile mit Start- und Endpunkt kürzen und die Zeile in eine txt Datei schreiben.
    Danke!



  • sickhaensen schrieb:

    Zuerst die XML Datei Zeilenweise einlesen und dann mit einer while Schleife auf den bestimmten Ausdruck für Start- und Endpunkt untersuchen.
    Anschließend noch die jeweilige Zeile mit Start- und Endpunkt kürzen ...

    Genau das kann man mit XML nicht machen. Eine XML Datei muss keine Zeilen enthalten.



  • Amateurvorschlag:

    #include <fstream>
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <string_view>
    
    std::string read_file(std::string_view fname)
    {
    	std::ifstream file{ fname.data() };
    	std::ostringstream stream;
    	stream << file.rdbuf();
    	return stream.str();
    }
    
    std::string extract(std::string_view s, std::size_t start, char delim = '"')
    {
    	if (s[start] != delim) return {};
    	std::size_t len{};
    	for (auto i = ++start; i < s.size() && s[i] != delim; ++i)
    		++len;
    	return std::string{ s.substr(start, len) };
    }
    
    int main()
    {
    	const std::string key{ "MyTag" };
    	auto file = read_file("test.txt");
    	auto pos = file.find(key);
    	std::cout << extract(file, pos + key.size()) << '\n';
    }
    


  • manni66 schrieb:

    sickhaensen schrieb:

    Zuerst die XML Datei Zeilenweise einlesen und dann mit einer while Schleife auf den bestimmten Ausdruck für Start- und Endpunkt untersuchen.
    Anschließend noch die jeweilige Zeile mit Start- und Endpunkt kürzen ...

    Genau das kann man mit XML nicht machen. Eine XML Datei muss keine Zeilen enthalten.

    Du hast im allgemeinen Fall zwar recht, aber manchmal hat an ja Zusatzwissen über die Datei, z.B. dass es Zeilen gibt. Ich habe hier auch den Fall von 100 - 200 MB (je nach Fall) großen XML-Dateien, wo mich ein paar bestimmte Einstellungen drin interessieren. Wenn ich die gesamte Datei in den XML-Parser kippe, parse ich >99,99% der Datei völlig umsonst. Daher lese ich jetzt einfach zeilenweise solange, bis das erste "Daten-Tag" komme und tue das bis dahin gelesene in einen Parser (boost::propery_tree). Geht vielleicht auch anders bzw. besser, aber so bin ich viel viel schneller als würde ich die gesamte Datei einlesen. Gut, jetzt könnte man anfangen zu argumentieren, dass für diese Menge an Konfiguration XML vielleicht nicht das richtige Format ist, aber naja. Kommt halt aus ner externen Software raus...



  • wob schrieb:

    Wenn ich die gesamte Datei in den XML-Parser kippe

    Du solltest dir mal einen SAX-Parser ansehen.

    wob schrieb:

    Kommt halt aus ner externen Software raus...

    D.h. also, die Formatierung kann sich bei jedem Update ändern.


Log in to reply