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++的结构化数据的传递。

更多相关文章

  1. Android(安卓)Studio初步使用教程
  2. Android(安卓)NDK探究奥秘一:Android(安卓)Studio创建第一个JNI项
  3. Android中Adapter用法总结
  4. 深入源码解析Android中的Handler,Message,MessageQueue,Looper
  5. Android(安卓)切换主题 (二)
  6. Android工程源文件结构
  7. Android(安卓)Resource
  8. Android中执行java命令的方法及java代码执行并解析shell命令
  9. NPM 和webpack 的基础使用

随机推荐

  1. 我开发的第一个Android软件
  2. Android(安卓)- listview未滚动触发onScr
  3. Android控件之Textiew的使用
  4. 横竖屏切换和contentView的三种显示方式
  5. 打电话
  6. android开机自启动的后台Service的实现
  7. android Configuration详解
  8. ImageView的属性android:scaleType,即Imag
  9. Android中build target,minSdkVersion,targ
  10. cygwin配置swig开发环境(Android)