Парсер TinyXML2 C++ странный тег

Доброе утро всем, я должен разобрать файл XML, и я решил использовать tinyxml2. Я что-то сделал, а потом остановился, потому что не знаю, как мне это разобрать.

<report>
<file name="com.kristanix.android.mahjongsolitaireepic.apk" size="29743 KB" sha1="af054314883c177b2fd533fc907fe5492fc498db" md5="f70d0175469a417facd0e5539c15efdf"/>
<app name="com.kristanix.android.mahjongsolitaireepic.apk" package="com.kristanix.android.mahjongsolitaireepic" version="2.0" minAPI="9">
<permissions>
<permission name="factory_test" used="TRUE" required="FALSE"/>
<permission name="get_tasks" used="TRUE" required="FALSE"/>
<permission name="record_audio" used="TRUE" required="FALSE"/>
<permission name="use_credentials" used="TRUE" required="FALSE"/>
<permission name="wake_lock" used="TRUE" required="FALSE"/>
<permission name="vibrate" used="TRUE" required="FALSE"/>
<permission name="access_wifi_state" used="TRUE" required="FALSE"/>
<permission name="read_contacts" used="TRUE" required="FALSE"/>
<permission name="access_fine_location" used="TRUE" required="FALSE"/>
<permission name="access_network_state" used="TRUE" required="TRUE"/>
<permission name="internet" used="TRUE" required="TRUE"/>
</permissions>
</app>
<analysis>
<virusTotalScore>0/57</virusTotalScore>
<obfuscation>partially</obfuscation>
<appVerification>
Nothing to verify. Application is policy compliant.
</appVerification>
<codeReview>Not Available.</codeReview>
<note/>
</analysis>
</report>

Моя проблема с тегом <permissionпотому что это не дочерний элемент прав доступа, ни атрибут. Это код C++ моего парсера

#include <stdio.h>
#include "tinyxml2.h"
#include <iostream>
using namespace tinyxml2;

#ifndef XMLCheckResult
#define XMLCheckResult(a_eResult) if (a_eResult != XML_SUCCESS) { printf("Error: %i\n", a_eResult); return a_eResult; }
#endif

int main() {
    //carico file
    XMLDocument doc;
    doc.LoadFile("test.xml");

    //controllo file
    XMLError eResult = doc.LoadFile("test.xml");
    XMLCheckResult(eResult);

    //minAPI
    int minapi; 
     XMLElement* attributeminapi = doc.FirstChildElement("report")->FirstChildElement("app");
     attributeminapi->QueryIntAttribute("minAPI", &minapi);

     //virus total (è una stringa)
     const char* virustot = doc.FirstChildElement("report")->FirstChildElement("analysis")->FirstChildElement("virusTotalScore")->GetText();

     //obfuscation
     const char* obfuscation = doc.FirstChildElement("report")->FirstChildElement("analysis")->FirstChildElement("obfuscation")->GetText();

     //PERMISSIONS
     //factory test
     XMLElement* fact = doc.FirstChildElement("report")->FirstChildElement("permissions");
     std::string str = fact->Attribute("name");

     return 0;
}

Разбор разрешения дает мне ошибку. Не могли бы вы мне помочь? большое спасибо

1 ответ

Решение

Вы получаете permissions (обратите внимание на "s") контейнерный тег, который, в свою очередь, содержит много permission теги внутри.

 XMLElement* fact = doc.FirstChildElement("report")->FirstChildElement("permissions");

Тогда вы пытаетесь получить доступ к name атрибут:

std::string str = fact->Attribute("name");

Тем не мение, permissions (обратите внимание на "s" снова) не имеет никаких атрибутов, это каждый из permission элементы, которые содержат "имя". Вместо этого вы должны перебрать permission элементы внутри permissionsи получите атрибут "name" для каждого из них:

for (tinyxml2::XMLElement* child = fact->FirstChildElement(); child != NULL; child = child->NextSiblingElement())
{
    std::string str = child->Attribute("name");
}
Другие вопросы по тегам