我正在编写用于GPX files的应用程序,使用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的仪器分析代码时,我注意到QDomNodeListPrivate::createList()负责大部分计算时间,并且QDomNodeList::count()和QDomNodeList::item()均对其进行调用。
似乎这不是迭代QDomElement的子元素的有效方法,因为似乎为每个操作都重新生成了列表。我应该使用哪种方法呢?
最佳答案
我尝试了这个
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,我也许可以更快地完成此操作,但是现在就可以了。