您的位置:首页 > 其它

VC轻松解析XML文件--CMarkup使用方法(解决解析中文字符出现乱码问题)

2009-07-03 13:10 543 查看
VC解析XML文件的工具有很多,CMarkup,
 

感谢作者http://canaan.jimdo.com/2009/05/25/vc轻松解析xml文件/

 

tinyXML,还有IBM的,MS的等等。

据说tinyXML很好,可能字符集问题,我编译不了。

所以就用CMarkup来解析,使用过后,觉得非常不错,使用起来很方便。

CMarkup下载地址:http://www.firstobject.com/

 

发现网上有方法很法,我就摘下来了



//----------UserInfo.xml--------------   

  

xml version="1.0" encoding="UTF-8" ?>    

  

 <UserInfo>   

  

  <UserID>luo</UserID>    

  

  <UserID>lin</UserID>    

  

  </UserInfo>  

//----------UserInfo.xml--------------

xml version="1.0" encoding="UTF-8" ?>

<UserInfo>

<UserID>luo</UserID>

<UserID>lin</UserID>

</UserInfo>

1. 生成UserInfo.xml

CMarkup xml;    

xml.SetDoc("xml version=/"1.0/" encoding=/"UTF-8/"?>/r/n");    

xml.AddElem("UserInfo");    

xml.IntoElem();    

xml.AddElem("UserID","luo");    

xml.AddElem("UserID","lin");    

xml.OutOfElem();    

xml.Save("UserInfo.xml");   

CMarkup xml;
xml.SetDoc("xml version=/"1.0/" encoding=/"UTF-8/"?>/r/n");
xml.AddElem("UserInfo");
xml.IntoElem();
xml.AddElem("UserID","luo");
xml.AddElem("UserID","lin");
xml.OutOfElem();
xml.Save("UserInfo.xml");

 

2. 浏览特定元素

//----查看所有UserID----    

CMarkup xml;    

xml.Load("UserInfo.xml");    

BOOL bFind = true;    

xml.ResetMainPos();    

while (xml.FindChildElem("UserID");)    

{    

      //此时接点还是父接点    

        CString strTagName = _T("");    

        CString strData = _T("");    

        strTagName = xml.GetChildTagName();    

        strData = xml.GetChildData();    

        TRACE("/n---tagName:%s,Data:%s--/n",strTagName,strData);    

}    

      /********************这样也可以******************   

      CMarkup xml;   

      xml.Load("UserInfo.xml");   

      BOOL bFind = true;   

      xml.ResetMainPos();   

        

      while (xml.FindChildElem("UserID");)   

      {   

                    xml.IntoElem();   

                    CString strTagName = _T("");   

                    CString strData = _T("");   

                    strTagName = xml.GetTagName();   

                    strData = xml.GetData();   

                    TRACE("/n---tagName:%s,Data:%s--/n",strTagName,strData);   

                    xml.OutOfElem();   

      }*/    

      /**************这样也可以**********************   

      CMarkup xml;   

      xml.Load("UserInfo.xml");   

      BOOL bFind = true;   

      xml.ResetMainPos();   

      xml.FindElem();  //UserInfo   

      xml.IntoElem();   

      while (xml.FindElem("UserID");)   

      {   

                    CString strTagName = _T("");   

                    CString strData = _T("");   

                    strTagName = xml.GetTagName();   

                    strData = xml.GetData();   

                    TRACE("/n---tagName:%s,Data:%s--/n",strTagName,strData);   

      }   

      */    

//-------------结果----------    

---tagName:UserID,Data:luo--    

---tagName:UserID,Data:lin—   

//----查看所有UserID----
CMarkup xml;
xml.Load("UserInfo.xml");
BOOL bFind = true;
xml.ResetMainPos();
while (xml.FindChildElem("UserID");)
{
//此时接点还是父接点
CString strTagName = _T("");
CString strData = _T("");
strTagName = xml.GetChildTagName();
strData = xml.GetChildData();
TRACE("/n---tagName:%s,Data:%s--/n",strTagName,strData);
}
/********************这样也可以******************
CMarkup xml;
xml.Load("UserInfo.xml");
BOOL bFind = true;
xml.ResetMainPos();

while (xml.FindChildElem("UserID");)
{
xml.IntoElem();
CString strTagName = _T("");
CString strData = _T("");
strTagName = xml.GetTagName();
strData = xml.GetData();
TRACE("/n---tagName:%s,Data:%s--/n",strTagName,strData);
xml.OutOfElem();
}*/
/**************这样也可以**********************
CMarkup xml;
xml.Load("UserInfo.xml");
BOOL bFind = true;
xml.ResetMainPos();
xml.FindElem(); //UserInfo
xml.IntoElem();
while (xml.FindElem("UserID");)
{
CString strTagName = _T("");
CString strData = _T("");
strTagName = xml.GetTagName();
strData = xml.GetData();
TRACE("/n---tagName:%s,Data:%s--/n",strTagName,strData);
}
*/
//-------------结果----------
---tagName:UserID,Data:luo--
---tagName:UserID,Data:lin—

 

3. 修改

 

//--------把UserID为”luo”改为”flypigluo”-----------    

BOOL bLoadXml = false;    

CMarkup xml;    

bLoadXml = xml.Load("UserInfo.xml");    

      if (bLoadXml)    

      {    

              CString strUserID = _T("");    

              xml.ResetMainPos();    

              xml.FindElem();    

              xml.IntoElem();    

              while (xml.FindElem("UserID"))    

              {    

                    strUserID = xml.GetData();    

                    if (strUserID=="luo")    

                    {    

                            xml.SetData(CString("flypig")+strUserID);    

                            xml.Save("UserInfo.xml");    

                            break;    

                    }    

              }    

      }   

//--------把UserID为”luo”改为”flypigluo”-----------
BOOL bLoadXml = false;
CMarkup xml;
bLoadXml = xml.Load("UserInfo.xml");
if (bLoadXml)
{
CString strUserID = _T("");
xml.ResetMainPos();
xml.FindElem();
xml.IntoElem();
while (xml.FindElem("UserID"))
{
strUserID = xml.GetData();
if (strUserID=="luo")
{
xml.SetData(CString("flypig")+strUserID);
xml.Save("UserInfo.xml");
break;
}
}
}

 

4. 添加

[b]4.1  添在最后面(使用的是AddElem)[/b]



//加在最后面    

      BOOL bLoadXml = false;    

      CMarkup xml;    

      bLoadXml = xml.Load("UserInfo.xml");    

      if (bLoadXml)    

      {    

              xml.ResetMainPos();    

              xml.FindElem();    

              xml.IntoElem();    

              xml.AddElem("UserID","luoluo");    

              xml.OutOfElem();    

              xml.Save("UserInfo.xml");    

      }    

//--------原来为------    

xml version="1.0" encoding="UTF-8" ?>    

<UserInfo>    

  <UserID>luo</UserID>    

  <UserID>lin</UserID>    

  </UserInfo>    

//---------添加后为-------------    

xml version="1.0" encoding="UTF-8" ?>    

<UserInfo>    

  <UserID>luo</UserID>    

  <UserID>lin</UserID>    

  <UserID>luoluo</UserID>    

  </UserInfo>   

 

4.2  加在最前面(使用InsertElem)

 



BOOL bLoadXml = false;    

CMarkup xml;    

bLoadXml = xml.Load("UserInfo.xml");    

if (bLoadXml)    

{    

      xml.ResetMainPos();    

      xml.FindElem();    

      xml.IntoElem();    

      xml.InsertElem("UserID","AddUserIDHead");    

      xml.OutOfElem();    

      xml.Save("UserInfo.xml");    

}    

//----原来为—    

xml version="1.0" encoding="UTF-8" ?>    

<UserInfo>    

  <UserID>luo</UserID>    

  <UserID>lin</UserID>    

  </UserInfo>    

//------修改后-----    

xml version="1.0" encoding="UTF-8" ?>    

<UserInfo>    

  <UserID>AddUserIDHead</UserID>    

  <UserID>luo</UserID>    

  <UserID>lin</UserID>    

  </UserInfo>   

BOOL bLoadXml = false;
CMarkup xml;
bLoadXml = xml.Load("UserInfo.xml");
if (bLoadXml)
{
xml.ResetMainPos();
xml.FindElem();
xml.IntoElem();
xml.InsertElem("UserID","AddUserIDHead");
xml.OutOfElem();
xml.Save("UserInfo.xml");
}
//----原来为—
xml version="1.0" encoding="UTF-8" ?>
<UserInfo>
<UserID>luo</UserID>
<UserID>lin</UserID>
</UserInfo>
//------修改后-----
xml version="1.0" encoding="UTF-8" ?>
<UserInfo>
<UserID>AddUserIDHead</UserID>
<UserID>luo</UserID>
<UserID>lin</UserID>
</UserInfo>

 

5. 删除

 



CMarkup xml;    

xml.Load("UserInfo.xml");    

BOOL bFind = true;    

xml.ResetMainPos();         

while (bFind)    

{    

      bFind = xml.FindChildElem("UserID");    

      if (bFind)    

      {    

              //此时接点还是父接点    

              CString strData = _T("");    

              strData = xml.GetChildData();    

              if (strData=="luo")    

              {    

                    xml.RemoveChildElem();    

            
eb08
        xml.Save("UserInfo.xml");    

                    break;    

              }    

      }    

}   

CMarkup xml;
xml.Load("UserInfo.xml");
BOOL bFind = true;
xml.ResetMainPos();
while (bFind)
{
bFind = xml.FindChildElem("UserID");
if (bFind)
{
//此时接点还是父接点
CString strData = _T("");
strData = xml.GetChildData();
if (strData=="luo")
{
xml.RemoveChildElem();
xml.Save("UserInfo.xml");
break;
}
}
}

 

6. 查找

见第二点浏览。类似上面的例子里面没有属性这些东西,下面的一个例子是有属性的

 



//UserInfo1.xml    

xml version="1.0" encoding="UTF-8" ?>    

<UserInfo>    

  <User UserID="UserID00" UserPwd="UserPwd00" UserLevel="158" />    

  <User UserID="UserID01" UserPwd="UserPwd01" UserLevel="162" />    

  <User UserID="UserID02" UserPwd="UserPwd02" UserLevel="165" />    

  <User UserID="UserID03" UserPwd="UserPwd03" UserLevel="168" />    

  <User UserID="UserID04" UserPwd="UserPwd04" UserLevel="171" />    

  <User UserID="UserID05" UserPwd="UserPwd05" UserLevel="175" />    

  <User UserID="UserID06" UserPwd="UserPwd06" UserLevel="178" />    

  <User UserID="UserID07" UserPwd="UserPwd07" UserLevel="181" />    

  <User UserID="UserID08" UserPwd="UserPwd08" UserLevel="184" />    

  <User UserID="UserID09" UserPwd="UserPwd09" UserLevel="188" />    

  </UserInfo>   

//UserInfo1.xml
xml version="1.0" encoding="UTF-8" ?>
<UserInfo>
<User UserID="UserID00" UserPwd="UserPwd00" UserLevel="158" />
<User UserID="UserID01" UserPwd="UserPwd01" UserLevel="162" />
<User UserID="UserID02" UserPwd="UserPwd02" UserLevel="165" />
<User UserID="UserID03" UserPwd="UserPwd03" UserLevel="168" />
<User UserID="UserID04" UserPwd="UserPwd04" UserLevel="171" />
<User UserID="UserID05" UserPwd="UserPwd05" UserLevel="175" />
<User UserID="UserID06" UserPwd="UserPwd06" UserLevel="178" />
<User UserID="UserID07" UserPwd="UserPwd07" UserLevel="181" />
<User UserID="UserID08" UserPwd="UserPwd08" UserLevel="184" />
<User UserID="UserID09" UserPwd="UserPwd09" UserLevel="188" />
</UserInfo>

 

7. 产生

 



CString strID = _T("");    

      CString strPwd = _T("");    

      CMarkup xml;    

      xml.SetDoc("xml version=/"1.0/" encoding=/"UTF-8/"?>");    

      xml.AddElem("UserInfo");    

      xml.IntoElem();    

      for (int i=0; i<10; i++)    

      {    

              //产生一个随机数,作为权限    

              srand(UINT(time(NULL)+i));    

              int nLevel = rand()%256;    

              strID.Format("UserID%02d",i);    

              strPwd.Format("UserPwd%02d",i);    

              xml.AddElem("User");    

              xml.AddAttrib("UserID",strID);    

              xml.AddAttrib("UserPwd",strPwd);    

              xml.AddAttrib("UserLevel",nLevel);    

      }    

      xml.OutOfElem();    

      xml.Save("UserInfo1.xml");   

CString strID = _T("");
CString strPwd = _T("");
CMarkup xml;
xml.SetDoc("xml version=/"1.0/" encoding=/"UTF-8/"?>");
xml.AddElem("UserInfo");
xml.IntoElem();
for (int i=0; i<10; i++)
{
//产生一个随机数,作为权限
srand(UINT(time(NULL)+i));
int nLevel = rand()%256;
strID.Format("UserID%02d",i);
strPwd.Format("UserPwd%02d",i);
xml.AddElem("User");
xml.AddAttrib("UserID",strID);
xml.AddAttrib("UserPwd",strPwd);
xml.AddAttrib("UserLevel",nLevel);
}
xml.OutOfElem();
xml.Save("UserInfo1.xml");

 

8. 查找



CMarkup xml;    

BOOL bLoad = false;    

BOOL bFind = false;    

bLoad = xml.Load("UserInfo1.xml");    

      if (bLoad)    

      {    

              CString strID;    

              CString strPwd;    

              xml.ResetMainPos();    

              xml.FindElem();    //UserInfo    

              while (xml.FindChildElem("User"))    

              {    

                    strID = xml.GetChildAttrib("UserID");    

                    strPwd = xml.GetChildAttrib("UserPwd");    

                    TRACE("/n----id:%s,pwd:%s-------/n",strID,strPwd);    

                    if (strID=="UserID00"&&strPwd=="UserPwd00")    

                    {    

                            bFind = true;    

                            break;    

                    }    

              }    

      }    

      if (bFind)    

      {    

              TRACE("/n---- find------/n");    

      }    

      else    

      {    

              TRACE("/n----no find------/n");    

      }   

CMarkup xml;
BOOL bLoad = false;
BOOL bFind = false;
bLoad = xml.Load("UserInfo1.xml");
if (bLoad)
{
CString strID;
CString strPwd;
xml.ResetMainPos();
xml.FindElem(); //UserInfo
while (xml.FindChildElem("User"))
{
strID = xml.GetChildAttrib("UserID");
strPwd = xml.GetChildAttrib("UserPwd");
TRACE("/n----id:%s,pwd:%s-------/n",strID,strPwd);
if (strID=="UserID00"&&strPwd=="UserPwd00")
{
bFind = true;
break;
}
}
}
if (bFind)
{
TRACE("/n---- find------/n");
}
else
{
TRACE("/n----no find------/n");
}

 

9. 修改

 



CMarkup xml;    

      BOOL bLoad = false;    

      BOOL bFind = false;    

      bLoad = xml.Load("UserInfo1.xml");    

      if (bLoad)    

      {    

              CString strID;    

              CString strPwd;    

              xml.ResetMainPos();    

              xml.FindElem();    //UserInfo    

              while (xml.FindChildElem("User"))    

              {    

                    strID = xml.GetChildAttrib("UserID");    

                    strPwd = xml.GetChildAttrib("UserPwd");    

                    TRACE("/n----id:%s,pwd:%s-------/n",strID,strPwd);    

                    if (strID=="UserID00"&&strPwd=="UserPwd00")    

                    {    

                            bFind = true;    

                            xml.SetChildAttrib("UserID",strID+CString("Modify"));    

                            xml.Save("UserInfo1.xml");    

                            break;    

                    }    

              }    

      }    

      if (bFind)    

      {    

              TRACE("/n---- find------/n");    

      }    

      else    

      {    

              TRACE("/n----no find------/n");    

      }   

CMarkup字符集问题

daubwu posted @ 2008年9月08日 00:54 in VC with tags XML CMarkup , 38 阅读

CMarkup支持Unicode,_MBCS宏定义。VS默认设置为MBCS宏定义,未设置该宏时为UTF-8编码。

有 MBCS宏定义,且 打开的文件是UTF-8编码:

CMarkup在Load时将UTF-8转换ANSI编码格式,所以要在读取的地方设置

 

#include <locale.h>
setlocale(LC_ALL, "");

没有MBCS宏定义,且打开的文件是UTF-8编码:

系统默认将文件按UTF-8格式读入系统中,所以显示的时候要手动将数据转换为ANSI格式的进行显示

 

#include <locale.h>
setlocale(LC_ALL, "");

strVal = CMarkup::UTF8ToA(strVal);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml encoding user null ibm tags
相关文章推荐