在Android开发之向您的项目添加C/C++代码这篇文章中说了在Andoid中使用C++的有点,以及如何在Java与C++建立通信。有兴趣的读者朋友可以参考上一篇文章。这篇文章我们讲,Android中,在C++层使用TinyXML解析与生成。
TinyxXML2参考网址
https://github.com/powerzhang/tinyxml2
TinyXML2是一个简单,小型,高效的C XML解析器,容易集成到其他程序中。TinyXML2将一个XML文档构建成一个DOM文档对象模型,可以读取,修改,保存。
XML是可扩展标记语言。XML的目的是传输数据,而非显示数据。XML是一种在人们和计算机都可以理解的描述结构化数据的标准。
我们解析的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开发之向您的项目添加C/C++代码的代码的基础上添加本节代码。
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++的结构化数据的传递。