QXmlStreamReader计数条目

时间:2012-03-19 22:37:29

标签: xml qt4

如何计算xml文件中的父项(或条目)?

下面的XML应该显示我不知道那里的条目,所以我需要计算标记以在循环中使用它们并将它们保存在QVector中。从那里开始,我可以在xml中搜索(现在已知的)标签并获取子项和属性(但这是另一回事)。 第一步是统计父母。

如果有人有更好的解决方案,那么请告诉我!

<?xml version="1.0" encoding="UTF-8" ?>
<Content>
    <person1>
        <firstname>John</firstname>
        <surname>Doe</surname>
        <email>john.doe@example.com</email>
        <website>http://en.wikipedia.org/wiki/John_Doe</website>
    </person1>
    <person2>
        <various>Some Text here.</various
        <website>http://www.google.com</website>
    </person2>
    <person3>
        <firstname>Jane</firstname>
        <surname>Doe</surname>
        <email>jane.doe@example.com</email>
        <website>http://en.wikipedia.org/wiki/John_Doe</website>
    </person3>
    <person4>
        <firstname>Matti</firstname>
        <surname>Meikäläinen</surname>
        <email>matti.meikalainen@example.com</email>
        <website>http://fi.wikipedia.org/wiki/Matti_Meikäläinen</website>
    </person4>
    <person5 Attribute="Test">
    </person5>
</Content>

我试图打开文件并在每行搜索一行时搜索一个RegExp(成功率较低),就像在bash中一样。但是Qt4的XML函数必须有更好的解决方案。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

看看这个:http://www.digitalfanatics.org/projects/qt_tutorial/chapter09.html 我更喜欢这个例子:http://jingfenghanmax.blogspot.de/2009/10/simple-qt-sax-parser.html

对于每个首发人员#-tag ,我会检索该人的整个数据集,以便在向量中推送此对象。最后,在解析XML之后,您只需要myVector.size();

这解决了我。

答案 1 :(得分:0)

我找到了解决方案。它不是很好但是有效:

    QFile* file = new QFile("SomeFile.xml");
    QXmlStreamReader xml(file);

    QString ElementName = "Content";
    QString ElementName_2 = "Content";
    int i = 0;
    int k = 0;

    while( !xml.atEnd() && !xml.hasError() )
    {
        QXmlStreamReader::TokenType token = xml.readNext();

        if( token == QXmlStreamReader::StartElement )
        {
            if( xml.name().toString() != ElementName )
            {
                ElementName = xml.name().toAscii();
            }
            if( xml.name().toString() == ElementName_2 )
            {
                ElementName = xml.name().toAscii();
            }
        }
        if( token == QXmlStreamReader::EndElement )
        {
            if( xml.name().toString() == ElementName )
            {
                i++;
            }
            if( xml.name().toString() != ElementName_2 )
            {
                k++;
            }
        }
    }

    if(xml.hasError())
    {
        SCC_MsgBox(QString("%1 parsing error").arg(XMLname), "", xml.errorString(), "", 2, 3); // my own MsgBox implementation ...
        return 0;
    }
    else
    {
        i = k - i;
        return i;
    }

    xml.clear();

这个计算所有元素(k)和所有Childs(i)并减去Elements中的Childs。所以我得到了条目数量(在这种情况下的人)。如果有人有更好的解决方案,那么请发布。