#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(),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,str.c_str(),-1,NULL,0);
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar(sourceCodepage,(LPWSTR)pUnicode,unicodeLen);
BYTE * pTargetData = NULL;
int targetLen = 0;
targetLen = ::WideCharToMultiByte(targetCodepage,(char *)pTargetData,NULL);
pTargetData=new BYTE[targetLen+1];
memset(pTargetData,targetLen+1);
::WideCharToMultiByte(targetCodepage,targetLen,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,int iEncoding); int insertNewElement(const char *cPathName,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