Tinyxml操作Xml文件问题

zhouxingyu896 2009-06-15 03:53:52
利用TinyXml操作Xml文件问题

1:网上看了不少例子,但是都不怎么详细,有没有详细的实例操作,帮助文件

2:TinyXml是怎么遍历的节点的

请用过的高手指导
...全文
653 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Treazy 2009-06-15
  • 打赏
  • 举报
回复
tinyxml 中有example的

基本上所有接口都有使用方法

包括STL与非STL两个版本
老邓 2009-06-15
  • 打赏
  • 举报
回复
这是我写的,在自己工程里用。
你修改一下。
供参考。

头文件:
#ifndef SDK_CONFIG_H_
#define SDK_CONFIG_H_

#include "xml/tinyxml.h"

// ----------------------------------------------------------------------------
// 配置文件保存在xml文件中,每个子功能对应一个配置文件
// ----------------------------------------------------------------------------
class Config
{
public:
SDKEXPORT Config(const char* fileName = "config");
SDKEXPORT ~Config();

public:
// 获取整型值,当查询值不存在时,保存默认值
SDKEXPORT int getInt(const char* element, const int def = 0);

// 设置整型值
SDKEXPORT bool setInt(const char* element, const int val);

// 获取布尔值
SDKEXPORT bool getBool(const char* element, const bool def = false);

// 设置布尔值
SDKEXPORT bool setBool(const char* element, const bool val);

// 获取文本
SDKEXPORT shared_ptr<wstring> getText(const char* element, const wchar_t* def = L"", const bool cdata = false);

// 设置文本
SDKEXPORT bool setText(const char* element, const wchar_t* val, const bool cdata = false);

private:
// 如果载入失败,则说明文件不存在或不规范,需要重建配置文件
SDKEXPORT bool loadCfgFile();

// 重新加载
SDKEXPORT bool reLoad();

// 创建配置文件
SDKEXPORT bool createCfgFile();

private:
// 获取根结点
TiXmlElement* getRoot();

private:
static const string _cfgFilePath;
const string _cfgFile;

TiXmlDocument _doc;
TiXmlElement* _root;
};

#endif // SDK_CONFIG_H_

实现:
#include "config.h"

const string Config::_cfgFilePath = *WC2MB((*getDataPath()).c_str());

Config::Config(const char* fileName) : _cfgFile(_cfgFilePath + "\\" + fileName + ".xml"),
_doc(_cfgFile.c_str()), _root(NULL)
{
if (!loadCfgFile())
{
if (createCfgFile()) reLoad();
}
}

Config::~Config()
{
_doc.SaveFile();
}

bool Config::loadCfgFile()
{
return _doc.LoadFile();
}

bool Config::reLoad()
{
return loadCfgFile();
}

bool Config::createCfgFile()
{
TiXmlDocument doc(_cfgFile.c_str());
TiXmlDeclaration* dec = new TiXmlDeclaration("1.0", "utf-8", "");
doc.LinkEndChild(dec);

TiXmlComment* cmt = new TiXmlComment((*WC2MB(DEF_AppName)).c_str());
doc.LinkEndChild(cmt);

TiXmlElement* root = new TiXmlElement("Config");
doc.LinkEndChild(root);

return doc.SaveFile();
}

TiXmlElement* Config::getRoot()
{
if (_root == NULL) _root = _doc.RootElement();
ASSERT(_root);
return _root;
}

int Config::getInt(const char* element, const int def)
{
TiXmlElement* target = getRoot()->FirstChildElement(element);

if (target != NULL)
{
int val;
int ret = target->QueryIntAttribute("int", &val);
if (ret == TIXML_SUCCESS) return val;
else if (ret == TIXML_NO_ATTRIBUTE) target->SetAttribute("int", def);
}
else
{
TiXmlElement* add = new TiXmlElement(element);
add->SetAttribute("int", def);
getRoot()->LinkEndChild(add);
}

return def;
}

bool Config::setInt(const char* element, const int val)
{
TiXmlElement* target = getRoot()->FirstChildElement(element);

if (target != NULL)
{
target->SetAttribute("int", val);
return true;
}

return false;
}

bool Config::getBool(const char* element, const bool def)
{
int i = def ? 1 : 0;
TiXmlElement* target = getRoot()->FirstChildElement(element);

if (target != NULL)
{
int val;
int ret = target->QueryIntAttribute("bool", &val);
if (ret == TIXML_SUCCESS) return val ? true : false;
else if (ret == TIXML_NO_ATTRIBUTE) target->SetAttribute("bool", i);
}
else
{
TiXmlElement* add = new TiXmlElement(element);
add->SetAttribute("bool", i);
getRoot()->LinkEndChild(add);
}

return def;
}

bool Config::setBool(const char* element, const bool val)
{
TiXmlElement* target = getRoot()->FirstChildElement(element);

if (target != NULL)
{
target->SetAttribute("bool", val);
return true;
}

return false;
}

shared_ptr<wstring> Config::getText(const char* element, const wchar_t* def, const bool cdata)
{
TiXmlElement* target = getRoot()->FirstChildElement(element);

if (target != NULL)
{
return UT2WC(target->GetText());
}
else
{
TiXmlElement* add = new TiXmlElement(element);
TiXmlText* txt = new TiXmlText((*WC2UT(def)).c_str());
txt->SetCDATA(cdata);
add->LinkEndChild(txt);
getRoot()->LinkEndChild(add);
}

return shared_ptr<wstring>(new wstring(def));
}

bool Config::setText(const char* element, const wchar_t* val, const bool cdata)
{
TiXmlElement* target = getRoot()->FirstChildElement(element);

if (target != NULL)
{
target->Clear();
TiXmlText* txt = new TiXmlText((*WC2UT(val)).c_str());
txt->SetCDATA(cdata);
target->LinkEndChild(txt);
return true;
}

return false;
}
The_facE 2009-06-15
  • 打赏
  • 举报
回复
tinyXml好像并没有给出一个直接遍历的函数,但是它能够从一个节点直接通向它的第一个子节点,最后一个子节点,上一个兄弟节点,下一个兄弟节点以及父节点。当然,也可以具体到第一个名为...的子节点或兄弟节点。

所以,想要完全遍历xml文件的树形结构,还需要你自己来处理。如果不在意效率的话,递归是逻辑关系最清楚的办法了。

整个tinyxml的源码中,头文件里的注释写的非常清晰,楼主可以仔细研究一下。在我看来,对于文件大小不算太大的xml文件,tinyxml是非常适合用来做文件操作的库了。

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧