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是一种在人们和计算机都可以理解的描述结构化数据的标准。
开发环境介绍
- OS: Window10
- 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++代码的代码的基础上添加本节代码。
- 如下图:我们在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(安卓)Studio初步使用教程
- Android(安卓)NDK探究奥秘一:Android(安卓)Studio创建第一个JNI项
- Android中Adapter用法总结
- 深入源码解析Android中的Handler,Message,MessageQueue,Looper
- Android(安卓)切换主题 (二)
- Android工程源文件结构
- Android(安卓)Resource
- Android中执行java命令的方法及java代码执行并解析shell命令
- NPM 和webpack 的基础使用