VS Studio 下利用minixml 解析包含多个相同element的xml格式的参数文件
Mini-XML 下载与编译
Mini-XML 是一个小型XML解析库,可从
https://github.com/michaelrsweet/mxml/archive/v3.2.zip
下载minixml ,最新版本是3.2版
解压到硬盘下,如下图所示
找到vcnet目录,如下图所示
用VS studio 打开mxml.sln工程,可以自行将源码编译为VS studio 开发需要的dll与lib,注意Debug与Release区别,以及Win32与X64的不同,并调整进行编译的VS版本,以免提示编译器找不到。
Mini-XML 加入自己的工程
- 将mxml.h放到\include目录下
- 将Debug、Release版mxml1.lib放到对应的库文件目录下,将mxml1.dll分别放入Debug、Release的执行路径下
- 在自己的工程的stdafx.h 文件中引入头文件mxml.h
#include "include/mxml.h" //xml解析
4. 在自己的工程中,打开工程属性,添加库文件mxml1.lib,以免编译时候找不到库文件
XML 解析
test.xml参数文件示例,假设该文件在D盘根路径下
<?xml version="1.0"?>
<params>
<id>1</id>
<num>8</num>
<data>
<childid>7</childid>
<value1>-9.2</value1>
<value2>0.3</value2>
</data>
<data>
<childid>8</childid>
<value1>3.2</value1>
<value2>5.3</value2>
</data>
</params>
解析代码如下
CString XMLFileInfo=”D:\\test.xml”;
FILE * Filefp;
mxml_node_t *Tree = NULL;
mxml_node_t *pParams = NULL;
mxml_node_t *pID = NULL;
mxml_node_t *pNum = NULL;
Filefp = fopen(XMLFileInfo, "r");
if (Filefp == NULL) return;
Tree = mxmlLoadFile(NULL, Filefp, MXML_TEXT_CALLBACK); //文件按文本格式读入
pParams = mxmlFindElement(Tree,Tree, "params", NULL, NULL, MXML_DESCEND);
pID = mxmlFindElement(pParams, Tree, "id", NULL, NULL, MXML_DESCEND);
pNum = mxmlFindElement(pParams,Tree, "num", NULL, NULL, MXML_DESCEND);
string tempID = mxmlGetText(pID,0);
string tempNums = mxmlGetText(pNum,0);
vector<Params> obtainedParams; //创建结构体保存读入的参数
int iID = atoi(tempID.c_str()); //字符串转整数
int inums = atoi(tempNums.c_str());//字符串转整数
mxml_node_t *DataNode;
DataNode = mxmlFindElement(pParams, Tree, "data", NULL, NULL, MXML_DESCEND);
while (1) //循环读入相同elements
{
if (!DataNode) break;
mxml_node_t *pchildid, *pvalue1,*pvalue2;
pchildid = mxmlFindElement(DataNode, pParams, "childid", NULL, NULL, MXML_DESCEND);
Pvalue1 = mxmlFindElement(DataNode, pParams, "value1", NULL, NULL, MXML_DESCEND);
pvalue2 = mxmlFindElement(DataNode, pParams, "value2", NULL, NULL, MXML_DESCEND);
string tempchildid = mxmlGetText(pchildid, 0);
string tempvalue1 = mxmlGetText(pvalue1, 0);
string tempvalue2 = mxmlGetText(pvalue2, 0);
Params tempParams;
tempParams.childid = atoi(tempchildid.c_str());//类别标签
tempParams.value2 = atof(tempvalue1.c_str());//字符串转实数
tempParams.value3 = atof(tempvalue2.c_str());//字符串转实数
obtainedParams.push_back(Params); //参数保存备用
DataNode = mxmlGetNextSibling(DataNode);
DataNode = mxmlGetNextSibling(DataNode);
}
mxmlDelete(Tree);
fclose(Filefp); //参数读入结束
注意:XML文件中的字符区分大小写