//---------------------------------------------------------------------------
#include "my_xml.h"
myXML::myXML():XmlDoc(NULL),Root(NULL),SavePause(0)
{
}
//-----------------------------------------------------------------------
myXML::myXML(AnsiString fpath) : XmlDoc(NULL),Root(NULL),SavePause(0)
{
init(fpath);
}
//-----------------------------------------------------------------------
void myXML::init(AnsiString fpath)
{
_fpath = fpath;
if( NULL != XmlDoc )delete XmlDoc; //我对这行代码没有信心,还请高人指点。
XmlDoc = NULL;
if( fpath.Length() == 0 )
{
}
else
{
if(FileExists(fpath)) //如果文件存在
{
try{ XmlDoc = LoadXMLDocument(fpath);}
catch(...){ XmlDoc = NULL;}
}
else //如果文件不存在,
{
try{ XmlDoc = NewXMLDocument(L"1.0"); } //创建, L""表示宽字符串。
catch(...){ XmlDoc = NULL;}
if( NULL == XmlDoc ){}
else XmlDoc->FileName = fpath;
}
}
if(XmlDoc == NULL){ Root = NULL; }
else
{
XmlDoc->Encoding = AnsiString("UTF-16");
//编码方式还可以选择:
//"gb2312" 与一般中文文本兼容
//"utf-8" 适于全部是英文的情况。
//"big5" 台湾繁体中文
Root = XmlDoc->DocumentElement;
if( Root == NULL )
{
XmlDoc->AddChild("root"); //根节点,必须有一个。一般用"root"
Root = XmlDoc->DocumentElement;
}
}
SavePause = 0;
}
//---------------------------------------------------------------------
bool myXML :: isNull()const{ return (Root == NULL); }
//---------------------------------------------------------------------
void myXML :: save()const //存盘
{
if( Root == NULL )return;
if( SavePause > 0 )return;
if( _fpath.Length() == 0 )return;
if( XmlDoc->Modified )
{
try{ XmlDoc->SaveToFile( _fpath ); }catch(...){}
}
}
//---------------------------------------------------------------------
xmlNode myXML :: root()const{ return xmlNode(Root);}
//---------------------------------------------------------------------
void myXML :: disable_save(){ ++SavePause; }
//---------------------------------------------------------------------
void myXML :: enable_save(){ --SavePause; save(); }
//---------------------------------------------------------------------
void myXML::save_to( AnsiString fpath_ )const //保存到...
{
if( Root == NULL )return;
try{ XmlDoc->SaveToFile( fpath_ ); }catch(...){}
}
//---------------------------------------------------------------------
//===========================================================================
//---------------------------------------------------------------------
//本函数用于替换掉字符串中含有的非法字符,防止其写入xml文件中。
//这里简单的用空格替换,不一定合适。有待大家指正。
static AnsiString & Valid(AnsiString & str)
{
const int Len = str.Length();
for(int i=1;i<=Len;++i)
{
char & c = str[i]; if(c > 0x00 && c < 0x20)c = ' ';
}
return str;
}
//-----------------------------------------------------------------------
xmlNode :: xmlNode(){ _node = NULL; }
//-----------------------------------------------------------------------
xmlNode :: xmlNode(_di_IXMLNode node){ _node = node;}
//-----------------------------------------------------------------------
void xmlNode :: init(_di_IXMLNode node){ _node = node;}
//-----------------------------------------------------------------------
bool xmlNode :: isNull()const{ return (_node == NULL); }
//-----------------------------------------------------------------------
xmlNode & xmlNode::operator = ( const xmlNode & node_ )
{
_node = node_._node; return *this;
}
//-----------------------------------------------------------------------
//返回一个名字是name的子节点,如果没有,创建一个。
xmlNode xmlNode :: get_child_node(AnsiString name)const
{
if(_node == NULL)return xmlNode(NULL);
_di_IXMLNode node = _node->ChildNodes->FindNode(name);
if(node == NULL)
{
return xmlNode(_node->AddChild(name));
}
else return xmlNode(node);
}
//-----------------------------------------------------------------------
//返回名字是name的子节点。
xmlNode xmlNode :: find_child_node(AnsiString name)const
{
if(_node == NULL)return xmlNode(NULL);
return xmlNode(_node->ChildNodes->FindNode(name));
}
//-----------------------------------------------------------------------
AnsiString xmlNode :: name()const
{
if(_node == NULL)return AnsiString();
return _node->NodeName;
}
//-----------------------------------------------------------------------
AnsiString xmlNode :: value()const //获得该节点的字符串值。
{
if(_node == NULL)return AnsiString();
AnsiString S;
try
{
OleVariant v = _node->Text;
if(v.IsNull())S = AnsiString();
else S = AnsiString(v);
}
catch(...){ S = AnsiString();}
return S;
}
//-----------------------------------------------------------------------
AnsiString xmlNode :: child_value(AnsiString name)const //返回子节点的值。
{
if(_node == NULL)return AnsiString();
AnsiString S;
try
{
OleVariant v = _node->ChildValues[name];
if(v.IsNull())S = AnsiString();
else S = AnsiString(v);
}
catch(...){ S = AnsiString();}
return S;
}
//-----------------------------------------------------------------------
void xmlNode::set_value( AnsiString value_ )const
{
if(_node == NULL)return; Valid( value_ );
try{ _node->Text = value_; }catch(...){}
}
//-----------------------------------------------------------------------
void xmlNode :: set_child_value(AnsiString name,AnsiString value)const
{
if(_node == NULL)return ;
Valid(value);
const _di_IXMLNode node = _node->ChildNodes->FindNode(name);
if(node == NULL)
{
if(value.Length() == 0);
else
{
try{ _node->AddChild(name)->Text = value;}catch(...){}
}
}
else
{
if(value.Length() == 0)
{
try{ _node->ChildNodes->Remove(node);}catch(...){}
}
else
{
try{ _node->ChildValues[name] = value;}catch(...){}
}
}
}
//-----------------------------------------------------------------------
AnsiString xmlNode :: attribute(AnsiString name)const
{
if(_node == NULL)return AnsiString();
AnsiString S;
try{
OleVariant v = _node->Attributes[name];
if(v.IsNull())S = AnsiString();
else S = AnsiString(v);
}
catch(...){ S = AnsiString();}
return S;
}
//-----------------------------------------------------------------------
void xmlNode :: set_attribute(AnsiString name,AnsiString value)const
{
if(_node == NULL)return ;
Valid(value);
if(value.Length() == 0)
{
try{ _node->Attributes[name] = Null();}catch(...){}
}
else
{
try{ _node->Attributes[name] = value;}catch(...){}
}
}
//-----------------------------------------------------------------------
void xmlNode :: find_child_nodes(vector<xmlNode> & nodes)const
{
if(_node == NULL)return ;
_di_IXMLNodeList List = _node->ChildNodes;
for(int i=0;i<List->Count;i++)
{
if( List->Nodes[i]->NodeType == ntElement )
{
nodes.push_back(List->Nodes[i]);
}
}
}
//-----------------------------------------------------------------------
//一次获得本节点所有的属性。
void xmlNode :: get_attrs(map<AnsiString,AnsiString> & attrs)const
{
if(_node == NULL)return ;
_di_IXMLNodeList List = _node->AttributeNodes ;
for(int i=0;i<List->Count;i++)
{
AnsiStrin
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
用c++builder读写xml数据的例子,此处将xml文件作为数据库,用listview显示,更改,增加,删除等数据库常用方法. 程序界面 http://ccb.zzia.cn/images/xml1.jpg http://ccb.zzia.cn/images/xml2.jpg
资源推荐
资源详情
资源评论
收起资源包目录
BCB中xml做数据库的例子.rar (35个子文件)
BCB中xml做数据库的例子
Project1.cpp 1KB
my_xml.h 4KB
Unit2.obj 19KB
Unit1.obj 32KB
Unit2.~h 1KB
Project1.exe 686KB
Project1.res 2KB
Unit1.~cpp 5KB
Project1.ils 4.13MB
Project1.tds 1.44MB
Project1.~bpr 5KB
Unit2.h 1KB
Unit1.~dfm 1KB
Unit1.dfm 1KB
my_xml.~h 4KB
Project1.ilf 3.63MB
Unit1.ddp 51B
Project1.ild 256KB
my_xml.obj 45KB
Project1.~cpp 1KB
Unit2.~cpp 1KB
Unit1.h 1KB
Unit2.~dfm 2KB
my_xml.cpp 9KB
Unit2.cpp 1KB
Unit1.cpp 5KB
Project1.ilc 1.81MB
my_xml.~cpp 9KB
Unit2.dfm 2KB
Unit1.~h 1KB
Unit1.~ddp 51B
Project1.obj 10KB
1.xml 1KB
Project1.bpr 5KB
www.pudn.com.txt 218B
共 35 条
- 1
资源评论
weixin_42653672
- 粉丝: 105
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功