【问题标题】:TinyXML2 parser c++ strange tagTinyXML2解析器C++奇怪的标签
【发布时间】:2016-01-03 01:00:22
【问题描述】:

大家早上好,我必须解析一个 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>

我的问题在于标签&lt;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;
}

权限解析给了我一个错误。你能帮我吗?非常感谢

【问题讨论】:

    标签: c++ xml parsing tinyxml2


    【解决方案1】:

    你在这里得到了permissions(注意“s”)容器标签,它里面又包含很多permission标签。

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

    那么你正在尝试访问它的name 属性:

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

    但是,permissions(再次注意“s”)没有任何属性,它是每个包含“name”的permission 元素。相反,您应该遍历permissions 中的permission 元素,并为每个元素获取“名称”属性:

    for (tinyxml2::XMLElement* child = fact->FirstChildElement(); child != NULL; child = child->NextSiblingElement())
    {
        std::string str = child->Attribute("name");
    }
    

    【讨论】:

    • 它不起作用,它总是给出相同的错误信息
    • @ScazzoMatto,究竟是哪个错误消息?您应该使用您尝试过的内容以及遇到的错误来更新您的帖子。
    • 这是我的错,因为权限是应用程序的子项。现在它起作用了!多谢。还有一个问题:我必须使用 doc.LoadFile("name1.xml), doc.LoadFile("name2.xml") 依次打开 100 个文件。我怎样才能只用一个命令打开它们?(如 for)跨度>
    • @Scazzo,可能你需要类似for(int i = 0; i &lt; 100; ++i) { std::stringstream sstm; sstm &lt;&lt; "file" &lt;&lt; i &lt;&lt; ".txt"; std::string filename = sstm.str(); }
    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    相关资源
    最近更新 更多