tinyxml能读写内存中的xml吗

 我来答
Mr朱由榔
2014-12-05 · TA获得超过2.9万个赞
知道大有可为答主
回答量:1.5万
采纳率:92%
帮助的人:7747万
展开全部
#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());

}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式