2016-10-09 4 views
0

Ich machte einen XML-Export der Datensätze in meiner Datenbank und ich möchte eine Importfunktion ausführen.Qt XML Parsing mit QXmlStreamReader

Meine XML sieht wie folgt aus:

<Group1> 
    <Group1Element> 
     <ID>1</ID> 
     <Name>First</Name> 
    </Group1Element> 
    <Group1Element> 
     <ID>2</ID> 
     <Name>Second</Name> 
    </Group1Element> 
</Group1> 

<Group2> 
    <Group2Element> 
     <ID>1</ID> 
     <Nickname>fir</Nickname> 
     <Name>First Name</Name> 
    </Group2Element> 
    <Group2Element> 
     <ID>2</ID> 
     <Nickname>sec</Nickname> 
     <Name>Second Name</Name> 
    </Group2Element> 
</Group2> 

Gruppe1 ist eine Tabelle, aus meiner Datenbank und Group2 ist eine andere Tabelle. Ich habe zwei Methoden, um die zwei Tabellensätze aus der XML-Datei zu lesen, aber egal, was ich tue, nur die erste Gruppe in der XML wird importiert. Wenn Gruppe1 die erste ist, die importiert wird, wenn Gruppe2 die erste in der Datei ist, wird diese importiert. Wenn die Lesemethode der zweiten Gruppe ausgeführt wird (in diesem Fall readGroup2()), wird die erste while-Schleife nur dreimal ausgeführt und nach "Group1 -> Group1Element -> ID" gestoppt. Was fehlt mir hier?

Hier ist mein Code:

void Import::readGroup1(QString filepath) 
{ 
    QFile file(filepath) 
    file.open(QIODevice::ReadOnly); 
    QXmlStreamReader stream(&file); 

    while(stream.readNextStartElement() && !stream.isEndDocument()) 
    { 
     if(stream.name() == "Group1Element") 
     { 
      qDebug() << " "; 

      while(stream.readNext() && !stream.isEndElement()) 
      { 
       if(stream.name() == "ID" || stream.name() == "Name") 
       { 
        qDebug() << stream.readElementText(); 
       } 
      } 
     } 
    } 
    file.close(); 
} 

void Import::readGroup2(QString filepath) 
{ 
    QFile file(filepath) 
    file.open(QIODevice::ReadOnly); 
    QXmlStreamReader stream(&file); 

    while(stream.readNextStartElement() && !stream.isEndDocument()) 
    { 
     if(stream.name() == "Group2Element") 
     { 
      qDebug() << " "; 

      while(stream.readNext() && !stream.isEndElement()) 
      { 
       if(stream.name() == "ID" || 
        stream.name() == "Nickname" || 
        stream.name() == "Name") 
       { 
        qDebug() << stream.readElementText(); 
       } 
      } 
     } 
    } 
    file.close(); 
} 
+0

Haben Sie diesen Code in einem Debugger tatsächlich durchlaufen, um zu sehen, was passiert? In seiner jetzigen Form ist das nicht wirklich eine sinnvolle Frage. – MrEricSir

Antwort

1

Ich glaube, es nur den ersten Block liest, weil der Leser gelesen wird, bis zum Ende des ersten Elements erreicht ist. Ich würde vorschlagen, Ihre XML zu folgendem Format zu ändern:

<Groups> 
    <Group1> 
    </Group1> 
    <Group2> 
    </Group2> 
</Groups> 

Dann implementieren Logik Ihrer verschiedene Gruppen in einer Funktion zu handhaben.

+0

Danke, es löst das Problem teilweise. Ich habe die XML-Struktur basierend auf Ihrer Antwort geändert (Ich habe die '- und '-Tags entfernt), also sind es nur die Gruppenelemente (' 'und' ') innerhalb einer großen Gruppe (' ') . So funktioniert es. Aber ich möchte die Gruppenelemente auch nach Gruppen trennen. Aber wenn ich die Gruppenelemente in Group1 und Group2 setze, scheitert es wieder, selbst wenn sie in einer großen Gruppe sind (''). – Alex

+0

Okay, habe das Problem gefunden, es funktioniert wie du gesagt hast, aber ich muss readNextStartElement() in simple readNext() ändern. Vielen Dank! – Alex