xml解析(tinyXml使用)

#include "myXml.h"
#include
#include
#include "tinyxml.h"

using namespace std;
//用下列字符串作为xml文件的初始内容:


int CMyXml::createXmlFile(const char* cPathName, const char* sXmlContent, int iEncoding)
{

//创建doc对象
 TiXmlDocument doc( cPathName);
 
 //TIXML_ENCODING_UNKNOWN =0,
 //TIXML_ENCODING_UTF8,
 //TIXML_ENCODING_LEGACY
 string sUTF8 = "";
 if( iEncoding == 1 )
 {

  //函数codeConvert是将sXmlContent字符串从当前的代码页转换为UTF8编码的字符串。
  sUTF8 = codeConvert( sXmlContent, ::GetACP(), CP_UTF8 );
 }
 else
 {
  sUTF8 = sXmlContent;
 }
 //在内存中生成xml树
 doc.Parse( sUTF8.c_str(),0,TiXmlEncoding(iEncoding) );
 if ( doc.Error() )
 {
  return -1;
 }

//保存为文件
 doc.SaveFile();
 return 0;
}

//2,加载文件到内存。读取xml。

//接下来可以使用doc对xml文件进行修改,读取等操作。

//3,插入新节点

//向xml文件中插入新的节点,cPathName为文件路径,cElmentName为要插入的节点的名称。
int CMyXml::insertNewElement(const char *cPathName,const char* rootNodeNane,const char* cElementName)
{

//首先加载xml文件
 TiXmlDocument doc;
 bool loadOkay = doc.LoadFile(cPathName);

 if ( !loadOkay )
 {
  return -1;
 }
 TiXmlNode* tRootNode = 0;

//找到root节点
 tRootNode = doc.FirstChild(rootNodeNane);

//创建一个新的节点cElementName
 TiXmlElement * tNewElement = new TiXmlElement( cElementName );
 TiXmlText tiInsertText( cElementName );
 tNewElement->InsertEndChild( tiInsertText );

 //创建一个新的节点
 //TiXmlElement * tNewElement = new TiXmlElement(cElementName);
// tNewElement->SetAttribute( "name", cElementName );
// tNewElement->SetAttribute( "status", "0" );


//将新创建的节点插入为root节点的孩子节点,而且为最后一个孩子节点。参数tRootNode为将要插入的节点的父节点。
 //LinkEndChild最好传入new出来的对象,否则会出现_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)问题
tRootNode->LinkEndChild(tNewElement);//tChildNode = toElement->InsertEndChild( tRootNode );

//保存文件。
 doc.SaveFile();
 return 0;
}

//4,插入新的text节点。0这类的节点称为text节点,和这样的节点有点区别

int CMyXml::setTextNodeText(const char *cPathName, const char *cText)
{
 TiXmlDocument doc( cPathName);
 bool loadOkay = doc.LoadFile(cPathName);

 if ( !loadOkay )
 {
  return -1;
 }
 TiXmlNode* tRootNode = 0;
 TiXmlNode* tChildNode = 0;
 TiXmlElement* todoElement = 0;

//找到根节点
 tRootNode = doc.FirstChild( _T("document") );
 assert( tRootNode );

//找根节点的第一个孩子节点
 //tChildNode = tRootNode->FirstChild( _T("good") );
 tChildNode = tRootNode->FirstChild();
 assert(tChildNode);

//创建新的节点

 TiXmlElement tiInsertNode( _T("good") );
 TiXmlText tiInsertText( cText );
 tiInsertNode.InsertEndChild( tiInsertText );

//插入
 tRootNode->ReplaceChild( tChildNode, tiInsertNode );

//保存
 doc.SaveFile();
 return 0;
}

//5,读取xml内容。将xml文件的内容导出为字符串。
int CMyXml::getXmlContent(const char *cPathName, string &sContent)
{
 TiXmlDocument doc;
 bool loadOkay = doc.LoadFile(cPathName);
 if ( !loadOkay )
 {
  return -1;
 }

 TiXmlPrinter printer;
 doc.Accept(&printer);
 //sContent = printer.CStr();
 sContent = printer.Str();//使用此函数时注意在预编译器中添加TIXML_USE_STL
//从根节点开始,以节点为单位导出

//然后便利所有的兄弟节点。
 return 0;
}

 

//转码
//获取当前的代码页,通过当前的代码页(sourceCodepage)转成目标编码(targetCodepage)的数据
string CMyXml::codeConvert( const string& str,  int  sourceCodepage,  int  targetCodepage)
{
    int  len = 0;
   
    len = str.length();
   
    int  unicodeLen = ::MultiByteToWideChar(sourceCodepage,0,str.c_str(),-1,NULL,0); 
   
    wchar_t *  pUnicode; 
    pUnicode = new  wchar_t[unicodeLen+1]; 
   
    memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); 
       
    ::MultiByteToWideChar(sourceCodepage,0,str.c_str(),-1,(LPWSTR)pUnicode,unicodeLen); 
   
    BYTE  pTargetData = NULL; 
    int  targetLen = 0;
    targetLen = ::WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char  *)pTargetData,0,NULL,NULL); 
   
    pTargetData=new  BYTE[targetLen+1]; 
    memset(pTargetData,0,targetLen+1); 
   
    ::WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char  *)pTargetData,targetLen,NULL,NULL); 
   
    string  rt; 
    rt = (char*)pTargetData; 
   
    delete  pUnicode; 
    delete  pTargetData;

    return  rt; 
}

 

#ifndef _CMYXML_H
#define _CMYXML_H

#include
#include

 

using namespace std;
class CMyXml
{
public:
 int createXmlFile(const char* cPathName, const char* sXmlContent, int iEncoding);
 int insertNewElement(const char *cPathName,const char* rootNodeNane,const char* cElementName);
 int setTextNodeText(const char *cPathName, const char *cText);
 int getXmlContent(const char *cPathName, string &sContent);
 string codeConvert( const string& str,  int  sourceCodepage,  int  targetCodepage);
};
#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值