Lastchild в XML-файле с использованием класса QDomDocument

у меня есть этот XML:

<VCAAnalysis>
<VCAStream>
<VCAFrame width="768" height="432" rtptime=""    utctime="102157000" utctimeHigh="0" configID="0" />
<VCAFrame width="768" height="432" rtptime="" utctime="102157160" utctimeHigh="0" configID="0">
<Object objectID="138.96.200.59_20160126_102157160_1" minX="276" minY="0" maxX="320" maxY="123" width="44" height="123" ObjPropTag="PERSON">
</Object>
</VCAFrame>
<VCAFrame width="768" height="432" rtptime="" utctime="102157320" utctimeHigh="0" configID="0" />
<VCAFrame width="768" height="432" rtptime="" utctime="102157480" utctimeHigh="0" configID="0">
<Object objectID="138.96.200.59_20160126_102157480_2" minX="224" minY="264" maxX="287" maxY="343" width="63" height="79" ObjPropTag="PERSON">
</Object>
</VCAFrame>
<VCAFrame width="768" height="432" rtptime="" utctime="102157640" utctimeHigh="0" configID="0">
<Object objectID="138.96.200.59_20160126_102157480_3" minX="204" minY="266" maxX="331" maxY="400" width="127" height="134" ObjPropTag="PERSON">
</Object>
</VCAFrame>
<VCAFrame width="768" height="432" rtptime=""    utctime="102157000" utctimeHigh="0" configID="0" />
</VCAStream>
</VCAAnalysis>

Я хочу получить последний идентификатор объекта (138.96.200.59_20160126_102157480_3) в последнем VCAFrame, у которого есть объект.

Я попробовал этот код, но он не работает.

         QDomNodeList a = VCAStream.elementsByTagName("VCAFrame");

if(a.size()!=0) {

QDomElement lastobj = VCAStream.lastChild().toElement();
QDomElement last = lastobj.firstChild().toElement();

QString lastid = last.attribute("objectID");
cout << qPrintable("laaaaaaaast "+lastid) << endl;
}

1

Решение

Это сработало для меня:

QDomNodeList vcaStreams = VCAStream.elementsByTagName("VCAStream");
QDomNodeList vcaFrames = vcaStreams.at(0).childNodes(); //Gives 6 VCAFrame tags
QDomNodeList vcaObjects = vcaFrames.at(4).childNodes(); //Gives 1 Object tag
qDebug() << vcaObjects.at(0).toElement().attribute("objectID");

lastobj в вашем коде ссылается на последний VCAFrame, который не имеет objectID.

РЕДАКТИРОВАТЬ: Если вам нужно перебрать весь XML-файл. Я предполагаю, что вы хотите последний vcaFrame, который имеет objectID в каждом VCAStream.

QDomNodeList vcaStreams = VCAStream.elementsByTagName("VCAStream");

for (int i = 0; i < vcaStreams.count(); ++i) {
QDomNodeList vcaFrames = vcaStreams.at(i).childNodes(); //Gives us all VCAFrameTags

//Find last tag with objectID
QDomElement last;
for (int j = vcaFrames.count() - 1; j >= 0; --j) {
//Assumes there is at most one <object> tag in each VCAFrame
if (vcaFrames.at(j).hasChildNodes()) {
QDomElement tmp = vcaFrames.at(j).firstChild().toElement();
if (tmp.hasAttribute("objectID")) {
last = tmp;
break;
}
}
}

//last now holds the last VCAFrame with an object tag or is Null
if (last.isNull())
qDebug() << "No objectID found";
else
qDebug() << last.attribute("objectID");

}

Я проверил это на вашем XML-файле, и он дал мне правильный результат, но я не пытался добавить более одного тега VCAStream.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]