这个格式是不是定的?
如果是定的那么容易点,普通的解析方法就是把字符串按逗号分成两串,然后分别把两串按等号再分,分别就有
s[0]="id"
S[1]="1"
S[2]="value"
s[3]="3"
这样就可以了。
只有你的字符串有规则,一般都能解析的,如果规则复杂那么就需要建立一个解析器了。我下面这个是解析xml查找串的,给你参考参考,就是解析类似这样的字符串/root/node[a='1']/node1[a="5"]
#pragma once
// CXMLFindor 命令目标
class CXMLFindor : public CObject
{
private :
typedef struct Link_s
{
char m_sNode[256+1];
char m_sAttr[256+1];
char m_sAttrValue[256+1];
struct Link_s *Next;
}LINK_S,*PTR_LINK_S;
PTR_LINK_S m_LinkHand;
public:
CXMLFindor();
virtual ~CXMLFindor();
private:
int Parse(char* sPath);
int IsAttributeFound(TiXmlAttribute *pAttr,PTR_LINK_S p);
public:
void ClearLink(void);
public:
CString GetValue(TiXmlDocument * xmlDoc,char *sPath);
};// XMLFindor.cpp : 实现文件
//
#include "stdafx.h"
#include "btpchk.h"
#include "XMLFindor.h"
#include "tinystr.h"
#include "tinyxml.h"
// CXMLFindor
CXMLFindor::CXMLFindor()
:m_LinkHand(NULL)
{
}
CXMLFindor::~CXMLFindor()
{
ClearLink();
}
// CXMLFindor 成员函数
int CXMLFindor::Parse(char* sPath)
{
/*
状态变换图:
/ a R(a) [ a R(a) =
S ---> 1 ---> 2 ----> 3 ---> 4 ----> 5 ------+
E | " | '
A V V
| 6 10
| | b | b
| V V
| 7 R(b) 11 R(b)
| | " | '
| / ] V |
+------------------------ 9 <---- 8 <-----+
E
注: A上箭头 >右箭头 <左箭头 V下箭头 R(b)循环输入b
数字为状态 S起始状态 E可以结束的状态
*/
PTR_LINK_S LP = NULL;
int iState=0;
int iError= -1;
int iStop = 0;
char *p = sPath;
char sTemp[256+1];
int iTemp = 0;
memset(sTemp,0x00,sizeof(sTemp));
while(*p != 0x00)
{
switch(iState)
{
case 0: //初始状态
if(*p != '/')
{
iError = p - sPath;
}
else
{
iState = 1;
iStop = 0;
}
break;
case 1: //
if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_')
{
sTemp[iTemp++] = *p;
iState = 2;
iStop = 1;
}
else
{
iError = p - sPath;
}
break;
case 2:
if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_')
{
sTemp[iTemp++] = *p;
iState = 2;
iStop = 1;
}
else if(*p == '/')
{
PTR_LINK_S newLP = new LINK_S();
sprintf_s(newLP->m_sNode,256,"%s",sTemp);
sprintf_s(newLP->m_sAttr,256,"%s","");
sprintf_s(newLP->m_sAttrValue,256,"%s","");
newLP->Next=NULL;
if( m_LinkHand == NULL)
{
m_LinkHand = newLP;
LP = newLP;
}
else
{
LP->Next = newLP;
LP = newLP;
}
TRACE("Node = [%s]\n",sTemp);
iTemp = 0;
memset(sTemp , 0x00, sizeof(sTemp));
iState = 1;
iStop = 0;
}
else if(*p == '[')
{
PTR_LINK_S newLP = new LINK_S();
sprintf_s(newLP->m_sNode,256,"%s",sTemp);
sprintf_s(newLP->m_sAttr,256,"%s","");
sprintf_s(newLP->m_sAttrValue,256,"%s","");
newLP->Next=NULL;
if( m_LinkHand == NULL)
{
m_LinkHand = newLP;
LP = newLP;
}
else
{
LP->Next = newLP;
LP = newLP;
}
TRACE("Node = [%s]\n",sTemp);
iTemp = 0;
memset(sTemp , 0x00, sizeof(sTemp));
iState = 3;
iStop = 0;
}
else
{
iError = p - sPath;
}
break;
case 3:
if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_')
{
sTemp[iTemp++] = *p;
iState = 4;
iStop = 0;
}
else
{
iError = p - sPath;
}
break;
case 4:
if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_')
{
sTemp[iTemp++] = *p;
iState = 4;
iStop = 0;
}
else if(*p == '=')
{
sprintf_s(LP->m_sAttr,256,"%s",sTemp);
TRACE("Attr = [%s]\n",sTemp);
iTemp = 0;
memset(sTemp , 0x00, sizeof(sTemp));
iState = 5;
iStop = 0;
}
else
{
iError = p - sPath;
}
break;
case 5:
if(*p == '\"')
{
iState = 6;
iStop = 0;
}
else if(*p == '\'')
{
iState = 10;
iStop = 0;
}
else
{
iError = p - sPath;
}
break;
case 6:
if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_' || (*p>='0' && *p<='9'))
{
sTemp[iTemp++] = *p;
iState = 7;
iStop = 0;
}
else
{
iError = p - sPath;
}
break;
case 7:
if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_' || (*p>='0' && *p<='9'))
{
sTemp[iTemp++] = *p;
iState = 7;
iStop = 0;
}
else if(*p == '\"')
{
sprintf_s(LP->m_sAttrValue,256,"%s",sTemp);
TRACE("AttrValue = [%s]\n",sTemp);
iTemp = 0;
memset(sTemp , 0x00, sizeof(sTemp));
iState = 8;
iStop = 0;
}
else
{
iError = p - sPath;
}
break;
case 8:
if(*p == ']')
{
iState = 9;
iStop = 2;
}
else
{
iError = p - sPath;
}
break;
case 9:
if(*p == '/')
{
iState = 1;
iStop = 0;
}
else
{
iError = p - sPath;
}
break;
case 10:
if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_' || (*p>='0' && *p<='9'))
{
sTemp[iTemp++] = *p;
iState = 11;
iStop = 0;
}
else
{
iError = p - sPath;
}
break;
case 11:
if((*p>='a' && *p <='z') || (*p>='A' && *p <='Z') || *p == '_' || (*p>='0' && *p<='9'))
{
sTemp[iTemp++] = *p;
iState = 11;
iStop = 0;
}
else if(*p == '\'')
{
sprintf_s(LP->m_sAttrValue,256,"%s",sTemp);
TRACE("AttrValue = [%s]\n",sTemp);
iTemp = 0;
memset(sTemp , 0x00, sizeof(sTemp));
iState = 8;
iStop = 0;
}
else
{
iError = p - sPath;
}
break;
}
if(iError != -1)
{
break;
}
p++;
}
if(iState == 2)
{
PTR_LINK_S newLP = new LINK_S();
sprintf_s(newLP->m_sNode,256,"%s",sTemp);
sprintf_s(newLP->m_sAttr,256,"%s","");
sprintf_s(newLP->m_sAttrValue,256,"%s","");
newLP->Next=NULL;
if( m_LinkHand == NULL)
{
m_LinkHand = newLP;
LP = newLP;
}
else
{
LP->Next = newLP;
LP = newLP;
}
TRACE("Node = [%s]\n",sTemp);
iTemp = 0;
memset(sTemp , 0x00, sizeof(sTemp));
}
TRACE("iError = [%d]\n",iError);
if(iError != -1)
{
ClearLink();
return iError + 1;
}
else
{
if(iStop == 0 )
{
ClearLink();
return -1;
}
else
{
return 0;
}
}
}
void CXMLFindor::ClearLink(void)
{
PTR_LINK_S p = this->m_LinkHand;
while(p!=NULL)
{
PTR_LINK_S dp = p;
p=p->Next;
delete dp;
}
}
int CXMLFindor::IsAttributeFound(TiXmlAttribute *pAttr,PTR_LINK_S p)
{
int iFound = -1;
if(strlen(p->m_sAttr) == 0) //无属性检查
return 0;
while(pAttr != NULL)
{
if(strcmp(p->m_sAttr, pAttr->Name() ) == 0 &&
strcmp(pAttr->Value(),p->m_sAttrValue) != 0)
{
iFound = 0;
break;
}
pAttr = pAttr->Next();
}
return iFound;
}
int CXMLFindor::GetValue(TiXmlDocument * xmlDoc,char *sPath)
{
int iRtn ;
iRtn = this->Parse(sPath);
if(iRtn != 0)
{
return iRtn;
}
PTR_LINK_S p = this->m_LinkHand;
TiXmlElement *pXml = NULL;
while(p != NULL)
{
TiXmlElement *pXml = xmlDoc->FirstChildElement(p->m_sNode);
//xmlDoc->
if(pXml == NULL) //路径错误
{
return -2;
}
else
{
while(pXml != NULL)
{
if(IsAttributeFound(pXml->FirstAttribute(),p) == 0)
{
break;
}
}
}
p=p->Next;
}
this->ClearLink();
}
追问用等号分割的时候用什么函数呢??可以具体说下么 谢谢~
追答可以自己写函数,也可以用现成的,但要看你是居于什么的程序
mfc结构的就用字符串的split就可以了
普通c语言的用strstr,
你可以百度一下