2016-10-09 67 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