2016-04-29 7 views
3

Jede Hilfe wäre willkommen, auch wenn es nur eine schnelle Idee ist.Parsen einer XML-Datei mit C++ - Stacks/Queues

Keine librarys (außer stl) oder externe Parsern

Ich soll ein C++ Programm erstellen, die die Daten einer XML-Datei gelesen wird und es im Speicher speichern, aber ich bin viel Mühe, einen Weg zu finden, um mach das. Ich hatte gehofft, dass ich hier von jemandem Hilfe bekommen könnte. Auch Regex sollte verwendet werden, um die Dateidaten zu erkennen oder aufzuteilen.

Tag Namen nicht aufbewahrt werden müssen, obwohl es ideal wäre, nur die Verschachtelung Daten, werden alle Daten als Text (string) gespeichert ist

Dies ist ein Beispiel, das Sie zeigt, was ich meine von Schornsteinen und Warteschlangen. Dies müsste jedoch nicht spezifisch sein.

<House>     // tag: push <House> on stack 
    <Info>    // tag: push <Coordinates> on stack 
    <Code>ABE</Code> // element: push_back on element queue 
    <City>Allentown</City> // element: push_back on element queue 
    <ID>PA</ID>   // element: puch_back on element queue 
    </Info>    // terminator: pop stack and complete node in queue 
    <Exact>    // tag: push <Exact> on stack 
    <X>40.65</X>  // element: push_back on element queue 
    <Y>75.43</Y>  // element: push_back on element queue 
    </Exact>    // terminator: pop stack and complete node in queue 
</House>    // terminator: pop stack and complete node in queue 

Bisher ist es ziemlich lahm, aber ich habe nur in der Lage, die Datei einzurichten, um Zeile für Zeile gelesen werden und die Header überspringen, indem es mit Regex wie diese Erkennung:

string fileline; 
regex header("[<][?](.*?)[?][>]"); 
while (getline(ifstreamobj, fileline)) 
{ 
    if (regex_match(fileline, header)) 
    { 
     cout<<"Skipping what appears to be a header"<<endl; 
    } 

    //? 
} 
cout << "END OF FILE, EOF" << endl; 

I Ich weiß nicht wirklich, was ich machen soll. Ich denke, der Stapel würde ein Stapel von Strings sein, wo der Tag-Namen geschoben werden würde/tauchte

Und dann würde die Warteschlange für die eigentlichen Daten werden zwischen den Tags

+1

Ich schlage vor, dass Sie einige der vorhandenen XML-Parser verwenden. [Diese SO Antwort] (http://stackoverflow.com/a/9387612/1593881) scheint eine schöne Sammlung zu haben. –

+1

Echte XML-Analyse ist kein Witz, müssen Sie nur eine Teilmenge von XML analysieren? Auch Ihr Xml ist falsch ' 40,65'. – user657267

+1

Whoops, jetzt behoben.Ich muss die gesamte XML-Datei wie dargestellt analysieren, aber ich würde nicht tiefer gehen als vielleicht 3 verschachtelte – fman

Antwort

0

Unter der Annahme, dass Sie meinen Nicht-Standard-Bibliotheken, wenn Sie sagen "keine Bibliotheken", sonst wird das eine sehr, sehr schwierige Aufgabe.

Ich würde einen Baum verwenden. Auf diese Weise hätten Sie in Ihrem Beispiel einen Knoten House mit zwei untergeordneten Knoten, Info und Exact. Der Knoten Info würde drei untergeordnete Knoten haben: Code, City und ID, die jeweils einen Datenknoten mit den Daten enthalten würden. Der Knoten Exact würde zwei untergeordnete Knoten haben, X und Y, die beide Datenknoten enthalten würden. Das ist die einfachste Art, diese Art von Daten zu speichern.

Edit: Für den regex Teil wie ein Schließen ich versuchen würde, die passenden Tags zu finden und dann in den Inhalt Rekursion, so etwas wie "\<([^/>]+)\>((?!\</\1\>)*)\</\1\>", die eine Öffnung Tag würde passen, erfassen die Inhalte, die nicht aussehen tag und stimmen Sie dann mit dem schließenden Tag überein. (Ich verwende möglicherweise eine andere Syntax als Ihre Tools verwenden, tut mir leid.) Aber diese Art von Übereinstimmung funktioniert nur, wenn derselbe Tag-Name nicht in den Inhalten verwendet werden kann.

Dieses Muster Spiel mit folgenden Eingabe:

<House><Mouse><House></House></Mouse></House> 

würde fängt den Tag-Namen House und den Inhalt <Mouse><House>, das ist nicht das, was Sie wollten. Diese falsche Übereinstimmung zu vermeiden, ist nicht trivial.

+1

Danke. Ich werde versuchen, einige Regex-Schlüssel zu erstellen. Aber in Bezug auf falsche Übereinstimmungen ist es sicher anzunehmen, dass alle Daten zwischen den Tags nur Buchstaben sind – fman