2016-10-09 89 views
0

我做了我的數據庫中的記錄的XML導出,我想做一個導入函數。用QXmlStreamReader Qt XML解析

我的XML看起來是這樣的:

<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> 

組別1是從我的數據庫中的表和第2組是另一個表。我有兩種方法可以從XML文件中讀取兩個表記錄,但不管我只做XML中的第一個組導入。如果Group1是第一個,那麼它被導入,如果Group2是文件中的第一個,那麼就導入它。 當第二組的read方法運行時(在本例中爲readGroup2()),第一個while循環只運行三次,並在「Group1 - > Group1Element - > ID」後停止。 我在這裏錯過了什麼?

這裏是我的代碼:

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

你真的在調試器中通過這段代碼來看看發生了什麼嗎?在目前的形式下,這不是一個真正有意義的問題。 – MrEricSir

回答

1

我相信這只是讀取第一個塊,因爲讀者會讀,直到到達第一個元素結束。我建議將您的XML更改爲以下格式:

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

然後,實現在一個函數中處理不同組的邏輯。

+0

謝謝,它部分解決了問題。 (我刪除了''標籤),所以它只是一個大組中的組元素(''和'')('') 。這樣它的工作。 但我想按組來分組。但是,如果我將組元素放入Group1和Group2中,即使它們在一個大組中(即''),它也會再次失敗。 – Alex

+0

好的,發現問題,它按照你的說法工作,但我必須將readNextStartElement()更改爲簡單的readNext()。謝謝! – Alex