C ++ / Qt QDomDocument遍历所有XML标记

时间:2016-04-20 13:13:41

标签: c++ xml qt qtxml

我的问题是, 我有一个表示为QDomDocument的大型XML样式文件,我需要在XML中的多个位置访问某些标记

我的XML看起来像这样

<Mat1>
    <Name>Mat_1</Name>
    <Properties>
        <Size>10</Size>
        <SizeMod>G</SizeMod>
    </Properties>
</Mat1>
<Mat2>
    <Name>Mat_2</Name>
    <Properties>
        <Size>15</Size>
        <SizeMod>k</SizeMod>
    </Properties>
</Mat2>

我需要访问所有出现的&#34; SizeMod&#34;和&#34;尺寸&#34;。问题是文件的布局可能会在将来定期更改,我希望我的代码能够与文件的所有版本一起使用。

目前我只是迭代所有带有多个for循环的childNodes,直到达到所需的深度,然后用if语句检查,如果我在正确的节点。

但这似乎是一种糟糕的方式。

1 个答案:

答案 0 :(得分:3)

正如@hank评论的那样,你应该使用QDomDocument::elementsByTagName(const QString &tagname)来获取元素 在名为tagname的文档中。

然后,遍历节点以获取每个QDomNode。最后,将QDomNode转换为QDomElement

我们正在打印元素的文本和标记名称的示例:

#include <QtXml>
#include <QtCore>

int main()
{
    QFile file(":/myxml.xml");

    file.open(QFile::ReadOnly|QFile::Text);

    QDomDocument dom;
    QString error;

    int line, column;

    if(!dom.setContent(&file, &error, &line, &column)) {
        qDebug() << "Error:" << error << "in line " << line << "column" << column;
        return -1;
    }

    QDomNodeList nodes = dom.elementsByTagName("Size");
    for(int i = 0; i < nodes.count(); i++)
    {
        QDomNode elm = nodes.at(i);
        if(elm.isElement())
        {
            qDebug() << elm.toElement().tagName()
                     << " = "
                     <<  elm.toElement().text();
        }
    }

    nodes = dom.elementsByTagName("SizeMod");
    for(int i = 0; i < nodes.count(); i++)
    {
        QDomNode elm = nodes.at(i);
        if(elm.isElement())
        {
            qDebug() << elm.toElement().tagName()
                     << " = "
                     << elm.toElement().text();
        }
    }

    return 0;
}