Android中,在C++层使用TinyXML解析XML文件

Android中,在C++层使用TinyXML解析XML文件

在Android开发之向您的项目添加C/C++代码这篇文章中说了在Andoid中使用C++的有点,以及如何在Java与C++建立通信。有兴趣的读者朋友可以参考上一篇文章。这篇文章我们讲,Android中,在C++层使用TinyXML解析与生成。

TinyXML相关知识

TinyxXML2参考网址

https://github.com/powerzhang/tinyxml2

TinyXML2是一个简单,小型,高效的C XML解析器,容易集成到其他程序中。TinyXML2将一个XML文档构建成一个DOM文档对象模型,可以读取,修改,保存。

XML是可扩展标记语言。XML的目的是传输数据,而非显示数据。XML是一种在人们和计算机都可以理解的描述结构化数据的标准。

开发环境介绍

  1. OS: Window10
  2. Development Environment :Qt5.8.0 , Android Studio3.0

代码介绍

我们解析的XML文件如下



    Abd5
    Abd9
    Abd4
    Abd3
    Abd2
    Abd1


我们首先在QtCreator创建一个C++的Project,然后将上述TinyxXML2参考网址下在TinyXML2的压缩包,并解压,将tinyxml2.cpp/.h复制到你的Project中。代码已上传至https://github.com/powerzhang/BodyMarkTinyXMLDemo。有兴趣的童鞋,可以前往下载。
下面是主要的代码,供大家参考。

解析文件的主要代码:

void BodyMarkParser::read(const char* filePath,vector &bodymarkBeanList){

     XMLDocument doc;
     if(doc.LoadFile(filePath)!=0)
     {
         printf("%s","load xml file failed");
         return ;
     }

    XMLElement* preset = doc.RootElement();
    XMLElement *bodymark = preset->FirstChildElement("bodymark");
    printf("%s","load bodymark xml file success");
    XMLElement *element = bodymark->FirstChildElement("element");
    while(element){
        string text = element->GetText();
       const char* filename = element->Attribute("filename");
       bool isDefault = element->BoolAttribute("default");
       int page = element->IntAttribute("page");
       int row = element->IntAttribute("row");
       int column = element->IntAttribute("column");
        BodyMarkBean bodymarkbean;
        bodymarkbean.text = text;
        bodymarkbean.filename = filename;
        bodymarkbean.isDefault = isDefault;
        bodymarkbean.page = page;
        bodymarkbean.row = row;
        bodymarkbean.column = column;
        bodymarkBeanList.push_back(bodymarkbean);

        element = element->NextSiblingElement();
    }
}

向XML中写入的核心代码

void BodyMarkParser::write(const char* filePath,vector& bodymarkBeanList){
    XMLDocument doc;

    XMLElement* root = doc.NewElement( "preset" );
    doc.InsertEndChild( root );
    XMLElement* bodymarkElement = doc.NewElement( "bodymark" );

    for(BodyMarkBean bodyMarkBean : bodymarkBeanList){
        XMLElement* element = doc.NewElement( "element" );

        element->SetText(bodyMarkBean.text.c_str());
        element->SetAttribute("filename",bodyMarkBean.filename.c_str());
        element->SetAttribute("default",bodyMarkBean.isDefault);
        element->SetAttribute("page",bodyMarkBean.page);
        element->SetAttribute("row",bodyMarkBean.row);
        element->SetAttribute("column",bodyMarkBean.column);
        bodymarkElement->InsertEndChild(element);
    }

    root->InsertEndChild(bodymarkElement);
    XMLError xx = doc.SaveFile( filePath );
    printf("xx : %d",xx);
}

在Android项目中添加TinyXML2

首先我们在上一节Android开发之向您的项目添加C/C++代码的代码的基础上添加本节代码。

  1. 如下图:我们在main/cpp/目录下创建TinyXml2的文件夹,将tinyxml2.cpp/.h文件复制到该目录下。然后再TinyXML2文件夹创建CMakeLists.txt文件。最后将bodymarkdemo.cpp/.h以及bodymarkparser.cpp/.h文件复制到cpp/目录下。

TinyXml2目录下的CMakeLists.txt的内容如下:

cmake_minimum_required(VERSION 3.4.1)
aux_source_directory(. DIR_LIB_SRCS)
add_library (TinyXML ${DIR_LIB_SRCS})

我们在NativeInterfaceInterface.cpp中进行验证
代码如下:

vector bodymarkBeanList1;
BodyMarkParser bodyMarkParser;
bodyMarkParser.read(xmlPath,bodymarkBeanList1);

LOGD("NativeInterface read finished Size:%d",bodymarkBeanList1.size());
for(auto i = bodymarkBeanList1.begin(); i != bodymarkBeanList1.end();i++)
{
    LOGD("NativeInterface text : %s ,filename:%s,isDefault : %d,page : %d,row : %d,column : %d",
           i->text.c_str(),
           i->filename.c_str(),
           i->isDefault,
           i->page,
           i->row,
           i->column);
}
bodyMarkParser.write(savePath,bodymarkBeanList1);

我们首先通过 bodyMarkParser.read(xmlPath,bodymarkBeanList1)将XML文件中的数据解析并保存草bodymarkBranList中,然后遍历输出;最后将bodymarkBeanList1中的数据存储到一个空的文件中。如果有兴趣的童鞋,请前往此处下载代码https://github.com/powerzhang/NativeInterface

下一节主要是Java与C++的结构化数据的传递。

你可能感兴趣的:(Android)