使用QXmlStreamReader

时间:2016-10-09 17:56:09

标签: xml qt parsing import stream

我在数据库中对记录进行了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>

Group1是我数据库中的表,Group2是另一个表。我有两种方法可以从XML文件中读取两个表记录,但不管我做什么,只导入XML中的第一个组。如果Group1是第一个然后导入,如果Group2是文件中的第一个,那么导入。 当第二组读取方法运行时(在本例中为readGroup2()),第一个while循环仅运行三次并在&#34; Group1 - &gt;之后停止。 Group1Element - &gt; ID&#34 ;. 我在这里缺少什么?

这是我的代码:

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();
}

1 个答案:

答案 0 :(得分:1)

我相信它只会读取第一个块,因为读取器将一直读到第一个元素的末尾。我建议将XML更改为以下格式:

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

然后,实现逻辑以在一个函数中处理不同的组。