首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

tinyxml能读写内存中的xml吗?解决方法

2012-11-03 
tinyxml能读写内存中的xml吗?我想用cstring来构造和传递xml数据以方便进行通讯,请问可以吗?如果可行,麻烦

tinyxml能读写内存中的xml吗?
我想用cstring来构造和传递xml数据以方便进行通讯,请问可以吗?如果可行,麻烦给个示例,谢谢。

[解决办法]
增加了从内存解析XML的tinyxml
http://download.csdn.net/download/rootkit192/2020690
[解决办法]
从内存中解析用TiXmlDocument的Parse函数
输出到内存用TiXmlPrint的函数
[解决办法]
#pragma once

#include<string>
#include "tinyxml.h"
using namespace std;

class CXML
{
public:
CXML(void)
{
}

~CXML(void)
{
}

private:

TiXmlDocument m_xml;
TiXmlElement* pElement;

private:

TiXmlElement* getFirstElement(string ElementMark,TiXmlElement* pcrElement);

public:

//解析xml字符串

int ParseXmlStr(string xmlstr);

//解析xml文件

int ParseXmlFile(string xmlFile);

//根据标签取值

int getFirstElementValue(string ElementMark,string& value);

//针对同一标签的记录取值,如果返回值是0表明再无此标签内容值可取

int getNextElementValue(string ElementMark,string& value);

//取得属性值

int getElementAttributeValue(string AttributeName,string& value);

//获取根结点

TiXmlElement* getRootElement();

//返回当前的xml字符串

string getXmlStr();

//清空解析的内容

void Clear();

//添加子节点

TiXmlElement* addXmlRootElement(string ElementMark);//添加一个根节点

//添加子节点

TiXmlElement* addXmlChildElement(TiXmlElement* pElement,string ElementMark);

//给节点添加值

void addElementValue(TiXmlElement* pElement,string value);

//添加属性及属性值

void addXmlAttribute(TiXmlElement* pElement,string AttributeMark,string value);

//添加声明

void addXmlDeclaration(string vesion,string encoding,string standalone);

//添加注释

void addXmlComment(TiXmlElement* pElement,string Comment);

//将xml内容保存到文件

void saveFile(string FileName);

};
可以自己封装,将string类型换成CString类型。
///////////////////实现文件
#include "stdafx.h"
#include "XML.h"

int CXML::ParseXmlFile(string xmlFile)

{

int result=0;

try

{

if(m_xml.LoadFile(xmlFile.c_str()))

result=1;

else

result=0;

}

catch(...)

{

}

return result;

}

int CXML::ParseXmlStr(std::string xmlStr)

{

int result=0;

if(xmlStr=="")

return 0;

try

{

if(m_xml.Parse(xmlStr.c_str()))

result=1;

else

result=0;

}

catch(...)

{

}

return result;

}

TiXmlElement* CXML::getFirstElement(string ElementMark,TiXmlElement* pcrElement)

{

TiXmlElement* pElementtmp=NULL;

pElementtmp=pcrElement;

while(pElementtmp)

{

if(strcmp(pElementtmp->Value(),ElementMark.c_str())==0)

{

//printf("%s\r\n",pElementtmp->Value());

return pElementtmp;

}

else

{

TiXmlElement* nextElement=pElementtmp->FirstChildElement();

while(nextElement)

{

//printf("%s\r\n",nextElement->Value());

if(strcmp(nextElement->Value(),ElementMark.c_str())==0)

{

return nextElement;

}

else

{

TiXmlElement* reElement=NULL;



reElement=getFirstElement(ElementMark,nextElement);

if(reElement)

{

return reElement;

}

}

nextElement=nextElement->NextSiblingElement();

}

}

pElementtmp=pElementtmp->NextSiblingElement();

}

return NULL;

}

//根据标签取值

int CXML::getFirstElementValue(string ElementMark,string& value)

{

int result=0;

if(ElementMark=="")

return 0;

try

{

TiXmlElement* pcrElement=NULL;

pcrElement=m_xml.RootElement();

pcrElement=this->getFirstElement(ElementMark,pcrElement);

if(pcrElement)

{

this->pElement=pcrElement;

value=this->pElement->GetText();

result=1;

}

}

catch(...)

{

}

return result;

}

int CXML::getNextElementValue(string ElementMark,string& value)

{

value="";

this->pElement=this->pElement->NextSiblingElement(ElementMark.c_str());

if(this->pElement)

{

value=this->pElement->GetText();

return 1;

}

return 0;

}

string CXML::getXmlStr()

{

string result="";

try

{

TiXmlPrinter printer;

m_xml.Accept(&printer);

result=printer.CStr();

}

catch(...)

{

}

return result;

}

void CXML::Clear()

{

m_xml.Clear();

}

//添加子节点

TiXmlElement* CXML::addXmlRootElement(string ElementMark)

{

TiXmlElement* RootElement=new TiXmlElement(ElementMark.c_str());

m_xml.LinkEndChild(RootElement);

return RootElement;

}

TiXmlElement* CXML::addXmlChildElement(TiXmlElement* pElement,string ElementMark)

{

if(pElement)

{

TiXmlElement* tempElement=new TiXmlElement(ElementMark.c_str());

pElement->LinkEndChild(tempElement);

return tempElement;

}

return 0;

}

void CXML::addElementValue(TiXmlElement *pElement, std::string value)

{

if(pElement)

{

TiXmlText *pContent=new TiXmlText(value.c_str());

pElement->LinkEndChild(pContent);

}

}

//添加属性及属性值

void CXML::addXmlAttribute(TiXmlElement* pElement,string AttributeMark,string value)

{

if(pElement)

{

pElement->SetAttribute(AttributeMark.c_str(),value.c_str());

}

}

//添加声明

void CXML::addXmlDeclaration(string vesion,string encoding,string standalone)

{

TiXmlDeclaration *pDeclaration=new TiXmlDeclaration(vesion.c_str(),encoding.c_str(),standalone.c_str());

m_xml.LinkEndChild(pDeclaration);

}

//添加注释

void CXML::addXmlComment(TiXmlElement* pElement,string Comment)

{

if(pElement)

{

TiXmlComment *pComment=new TiXmlComment(Comment.c_str());

pElement->LinkEndChild(pComment);

}

}

TiXmlElement* CXML::getRootElement()

{

return m_xml.RootElement();

}

//取得属性值

int CXML::getElementAttributeValue(string AttributeName,string& value)

{

if(this->pElement->Attribute(AttributeName.c_str()))

{

value=this->pElement->Attribute(AttributeName.c_str());

return 1;

}

return 0;



}

void CXML::saveFile(string FileName)

{

this->m_xml.SaveFile(FileName.c_str());

}

//////////////////////////////////////////

热点排行