发现xml存储,查看方便。所以想用用它,但是解析它不太容易。我用C++自带的string类 勉强实现了这一功能。
我生成了这样一串xml:(carinfo.xml)
<carnode><id>0</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<carnode><id>1</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<carnode><id>2</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<carnode><id>3</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<carnode><id>4</id><time>11:32</time><event>这家伙违章了!</event></carnode>
<car></car>里面代表了一辆车,里面是它的元素。
大致思路是这样: 先把这一文件转换为string类型,string 类型里有find() ,rfind(),erase() 方法,从尾到头的
解析,解析一个节点,马上删除一个节点,这样每次循环只要处理最后一个节点,简化处理。
int main()
{
//定义元素分隔符
const char node_starter[15] = "<carnode>";
const char node_ender[15] = "</carnode>";
const char id_starter[15] = "<id>";
const char id_ender[15] = "</id>";
const char time_starter[15] = "<time>";
const char time_ender[15] = "</time>";
const char event_starter[15] = "<event>";
const char event_ender[15] = "</event>";
//解析xml文件,要能给出节点的个数 ,需要字符串匹配
//一次解析一个节点,然后文件指针指向下一个节点,直到没有了节点
//对于每个节点里面,
FILE* inputxml = fopen( "carinfo.xml" , "rb" ); //打开一个只读asic文件
//利用强大的STL
vector<char> c_vector;
//从文件读入字符到向量
while( !feof( inputxml ) )
{
char temp_char = fgetc( inputxml );
c_vector.push_back( temp_char );
}
fclose(inputxml);
char c_array[ c_vector.size() ];
int index = 0;
//从向量中取出字符到数组,并加上结束标志
for(vector<char>::iterator it = c_vector.begin();it != c_vector.end();it++)
{
c_array[ index ] = *it;
if(index == ( c_vector.size() - 1 ) )
{
c_array[ index ] = '\0';
}
index++;
}
string file_copy( c_array );
cout<<"test:: the file string is:\n"<<file_copy<<endl;
unsigned int node_count = 0;
//有了string类型,字符串匹配就方便了
//每次循环找最后一对<carnode></carnode>,找到就删除,再找下一对,这样就能得到节点的个数
//结束标志 :长度为0
while(file_copy.size()>1)
{
node_count++;
int last_carnode_starter_position = file_copy.rfind( node_starter );
//在这里就只需要慢慢的解析一个节点的元素了
string event_string;
parseElement( event_starter , event_ender , file_copy , event_string);
cout<< "the event:" << event_string << "<|>" ;
string time_string;
parseElement( time_starter , time_ender , file_copy , time_string);
cout<<"the time:"<<time_string<<"<|>";
string id_string;
parseElement( id_starter , id_ender , file_copy , id_string);
cout<<"the id:"<<id_string<<endl;
file_copy.erase( last_carnode_starter_position );
}
cout<<"the node number is: "<<node_count<<endl;
system( "PAUSE" );
return 1;
}
/*************
解析一个节点里的某个元素
parameter:
starter
ender
file_string
result
里面的数学关系搞对就行,所以就不多注释
*************/
bool parseElement(const char* starter,const char* ender,const string file_string,string& result)
{
short starter_position = file_string.rfind( starter );
short ender_position = file_string.rfind( ender );
short result_string_size = ender_position - ( starter_position + strlen( starter ) );
char result_storage[ result_string_size + 1];
for(short index = 0;index < result_string_size ;index++)
{
result_storage[ index ] = file_string[ starter_position + strlen( starter ) + index];
}
result_storage[ result_string_size ] = '\0';
result=string(result_storage);
}
string 能支持4G的长度,我想这样一般的需求还是能满足的,不必用第三方库了。