3

我正在编写一个用于处理GPX 文件的应用程序,并且在使用 QDomElement 类读取大型 XML 文档时遇到了性能问题。包含数千个航点的 GPS 路径文件可能需要半分钟才能加载。

这是我用于读取路径(路线或轨道)的代码:

void GPXPath::readXml(QDomElement &pathElement)
{
    for (int i = 0; i < pathElement.childNodes().count(); ++i)
    {
        QDomElement child = pathElement.childNodes().item(i).toElement();
        if (child.nodeName() == "trkpt" ||
            child.nodeName() == "rtept")
        {
            GPXWaypoint wpt;
            wpt.readXml(child);
            waypoints_.append(wpt);
        }
    }
}

在使用 Apple 的 Instruments 分析代码时,我注意到 QDomNodeListPrivate::createList() 负责大部分计算时间,它被 QDomNodeList::count() 和 QDomNodeList::item() 调用。

看起来这不是遍历 QDomElement 的子元素的有效方法,因为似乎为每个操作重新生成了列表。我应该改用什么方法?

4

2 回答 2

3

我试过这个

void GPXPath::readXml(QDomElement &pathElement)
{
    QDomElement child = pathElement.firstChildElement();
    while (!child.isNull())
    {
        if (child.nodeName() == "trkpt" ||
            child.nodeName() == "rtept")
        {
            GPXWaypoint wpt;
            wpt.readXml(child);
            waypoints_.append(wpt);
        }
        child = child.nextSiblingElement();
    }
}

事实证明,它快了 15 倍。通过使用 SAX,我也许可以更快地完成它,但现在就可以了。

于 2012-10-23T19:17:07.777 回答
0

您应该考虑使用QT SAX而不是 DOM。SAX 解析器通常不会将整个 XML 文档加载到内存中,并且在您的情况下很有用

于 2012-07-21T19:07:50.767 回答