加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml解析(tinyXml使用)

发布时间:2020-12-16 09:22:35 所属栏目:百科 来源:网络整理
导读:#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(

#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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读