my_xml.cpp
上传用户:wangli
上传日期:2008-04-19
资源大小:3077k
文件大小:9k
源码类别:

xml/soap/webservice

开发平台:

C++ Builder

  1. //---------------------------------------------------------------------------
  2. #include "my_xml.h"
  3. myXML::myXML():XmlDoc(NULL),Root(NULL),SavePause(0)
  4. {
  5. }
  6. //-----------------------------------------------------------------------
  7. myXML::myXML(AnsiString fpath) : XmlDoc(NULL),Root(NULL),SavePause(0)
  8. {
  9.    init(fpath);
  10. }
  11. //-----------------------------------------------------------------------
  12. void myXML::init(AnsiString fpath)
  13. {
  14.     _fpath = fpath;
  15.     if( NULL != XmlDoc )delete XmlDoc; //我对这行代码没有信心,还请高人指点。
  16.     XmlDoc = NULL;
  17.     if( fpath.Length() == 0 )
  18.     {
  19.     }
  20.     else
  21.     {
  22.        if(FileExists(fpath))    //如果文件存在
  23.        {
  24.            try{ XmlDoc = LoadXMLDocument(fpath);}
  25.            catch(...){ XmlDoc = NULL;}
  26.        }
  27.        else                  //如果文件不存在,
  28.        {
  29.           try{ XmlDoc = NewXMLDocument(L"1.0"); }   //创建, L""表示宽字符串。
  30.           catch(...){ XmlDoc = NULL;}
  31.           if( NULL == XmlDoc ){}
  32.           else XmlDoc->FileName = fpath; 
  33.        }
  34.     }
  35.     if(XmlDoc == NULL){ Root = NULL; }
  36.     else
  37.     {
  38.         XmlDoc->Encoding = AnsiString("UTF-16");
  39.                              //编码方式还可以选择:
  40.                              //"gb2312" 与一般中文文本兼容
  41.                              //"utf-8"  适于全部是英文的情况。
  42.                              //"big5"   台湾繁体中文
  43.         Root = XmlDoc->DocumentElement;
  44.         if( Root == NULL )
  45.         {
  46.             XmlDoc->AddChild("root");  //根节点,必须有一个。一般用"root"
  47.             Root = XmlDoc->DocumentElement;
  48.         }
  49.     }
  50.     SavePause = 0;
  51. }
  52. //---------------------------------------------------------------------
  53. bool myXML :: isNull()const{  return (Root == NULL); }
  54. //---------------------------------------------------------------------
  55. void myXML :: save()const     //存盘
  56. {
  57.     if( Root == NULL )return;
  58.     if( SavePause > 0 )return;
  59.     if( _fpath.Length() == 0 )return;
  60.     if( XmlDoc->Modified )    
  61.     {
  62.       try{ XmlDoc->SaveToFile( _fpath ); }catch(...){}
  63.     }
  64. }
  65. //---------------------------------------------------------------------
  66. xmlNode myXML :: root()const{   return xmlNode(Root);}
  67. //---------------------------------------------------------------------
  68. void myXML :: disable_save(){  ++SavePause; }
  69. //---------------------------------------------------------------------
  70. void myXML :: enable_save(){  --SavePause; save(); }
  71. //---------------------------------------------------------------------
  72. void myXML::save_to( AnsiString fpath_ )const  //保存到... 
  73. {
  74.    if( Root == NULL )return;
  75.    try{ XmlDoc->SaveToFile( fpath_ ); }catch(...){}
  76. }
  77. //---------------------------------------------------------------------
  78. //===========================================================================
  79. //---------------------------------------------------------------------
  80. //本函数用于替换掉字符串中含有的非法字符,防止其写入xml文件中。
  81. //这里简单的用空格替换,不一定合适。有待大家指正。
  82. static AnsiString & Valid(AnsiString & str)
  83. {
  84.    const int Len = str.Length();
  85.    for(int i=1;i<=Len;++i)
  86.    {
  87.       char & c = str[i];   if(c > 0x00 && c < 0x20)c = ' ';
  88.    }
  89.    return str;
  90. }
  91. //-----------------------------------------------------------------------
  92. xmlNode :: xmlNode(){ _node = NULL; }
  93. //-----------------------------------------------------------------------
  94. xmlNode :: xmlNode(_di_IXMLNode node){    _node = node;}
  95. //-----------------------------------------------------------------------
  96. void xmlNode :: init(_di_IXMLNode node){    _node = node;}
  97. //-----------------------------------------------------------------------
  98. bool xmlNode :: isNull()const{  return (_node == NULL); }
  99. //-----------------------------------------------------------------------
  100. xmlNode & xmlNode::operator = ( const xmlNode & node_ ) 
  101. {
  102.    _node = node_._node;    return *this;
  103. }
  104. //-----------------------------------------------------------------------
  105. //返回一个名字是name的子节点,如果没有,创建一个。
  106. xmlNode xmlNode :: get_child_node(AnsiString name)const
  107. {
  108.     if(_node == NULL)return xmlNode(NULL);
  109.     _di_IXMLNode node = _node->ChildNodes->FindNode(name);
  110.     if(node == NULL)
  111.     {
  112.         return xmlNode(_node->AddChild(name));
  113.     }
  114.     else return xmlNode(node);
  115. }
  116. //-----------------------------------------------------------------------
  117. //返回名字是name的子节点。
  118. xmlNode xmlNode :: find_child_node(AnsiString name)const
  119. {
  120.     if(_node == NULL)return xmlNode(NULL);
  121.     return xmlNode(_node->ChildNodes->FindNode(name));
  122. }
  123. //-----------------------------------------------------------------------
  124. AnsiString xmlNode :: name()const
  125. {
  126.    if(_node == NULL)return AnsiString();
  127.    return _node->NodeName;
  128. }
  129. //-----------------------------------------------------------------------
  130. AnsiString xmlNode :: value()const  //获得该节点的字符串值。
  131. {
  132.     if(_node == NULL)return AnsiString();
  133.     AnsiString S;
  134.     try
  135.     {
  136.         OleVariant v = _node->Text;
  137.         if(v.IsNull())S = AnsiString();
  138.         else S = AnsiString(v);
  139.     }
  140.     catch(...){ S = AnsiString();}
  141.     return S;
  142. }
  143. //-----------------------------------------------------------------------
  144. AnsiString xmlNode :: child_value(AnsiString name)const //返回子节点的值。
  145. {
  146.     if(_node == NULL)return AnsiString();
  147.     AnsiString S;
  148.     try
  149.     {
  150.         OleVariant v = _node->ChildValues[name];
  151.         if(v.IsNull())S = AnsiString();
  152.         else S = AnsiString(v);
  153.     }
  154.     catch(...){ S = AnsiString();}
  155.     return S;
  156. }
  157. //-----------------------------------------------------------------------
  158. void xmlNode::set_value( AnsiString value_ )const  
  159. {
  160.     if(_node == NULL)return;    Valid( value_ );
  161.     try{ _node->Text = value_; }catch(...){}
  162. }
  163. //-----------------------------------------------------------------------
  164. void xmlNode :: set_child_value(AnsiString name,AnsiString value)const
  165. {
  166.     if(_node == NULL)return ;
  167.     Valid(value);
  168.     const _di_IXMLNode node = _node->ChildNodes->FindNode(name);
  169.     if(node == NULL) 
  170.     {
  171.         if(value.Length() == 0);
  172.         else
  173.         {
  174.             try{ _node->AddChild(name)->Text = value;}catch(...){}
  175.         }
  176.     }
  177.     else
  178.     {
  179.         if(value.Length() == 0)
  180.         {
  181.             try{ _node->ChildNodes->Remove(node);}catch(...){}
  182.         }
  183.         else
  184.         {
  185.             try{ _node->ChildValues[name] = value;}catch(...){}
  186.         }
  187.     }
  188. }
  189. //-----------------------------------------------------------------------
  190. AnsiString xmlNode :: attribute(AnsiString name)const
  191. {
  192.     if(_node == NULL)return AnsiString();
  193.     AnsiString S;
  194.     try{
  195.         OleVariant v = _node->Attributes[name];
  196.         if(v.IsNull())S = AnsiString();
  197.         else S = AnsiString(v);
  198.     }
  199.     catch(...){ S = AnsiString();}
  200.     return S;
  201. }
  202. //-----------------------------------------------------------------------
  203. void xmlNode :: set_attribute(AnsiString name,AnsiString value)const
  204. {
  205.     if(_node == NULL)return ;
  206.     Valid(value);
  207.     if(value.Length() == 0)
  208.     {
  209.         try{ _node->Attributes[name] = Null();}catch(...){}
  210.     }
  211.     else
  212.     {
  213.         try{ _node->Attributes[name] = value;}catch(...){}
  214.     }
  215. }
  216. //-----------------------------------------------------------------------
  217. void xmlNode :: find_child_nodes(vector<xmlNode> & nodes)const  
  218. {
  219.     if(_node == NULL)return ;
  220.     _di_IXMLNodeList List = _node->ChildNodes;
  221.     for(int i=0;i<List->Count;i++)
  222.     {
  223.       if( List->Nodes[i]->NodeType == ntElement )
  224.       {
  225.          nodes.push_back(List->Nodes[i]);
  226.       }
  227.     }
  228. }
  229. //-----------------------------------------------------------------------
  230. //一次获得本节点所有的属性。
  231. void xmlNode :: get_attrs(map<AnsiString,AnsiString> & attrs)const
  232. {
  233.    if(_node == NULL)return ;
  234.    _di_IXMLNodeList List = _node->AttributeNodes ;
  235.    for(int i=0;i<List->Count;i++)
  236.    {
  237.       AnsiString attr_name = List->Nodes[i]->NodeName;
  238.       AnsiString attr_value;
  239.       try{ attr_value = List->Nodes[i]->NodeValue; }
  240.       catch(...){ attr_value = AnsiString(); }
  241.       attrs.insert(make_pair(attr_name,attr_value));
  242.    }
  243. }
  244. //-----------------------------------------------------------------------
  245. //先将旧的属性全部删除,新属性作为一个整体增加。
  246. void xmlNode :: set_attrs(const map<AnsiString,AnsiString> & attrs)const
  247. {
  248.    if(_node == NULL)return ;
  249.    _node->AttributeNodes->Clear();
  250.    map<AnsiString,AnsiString>::const_iterator p;
  251.    for( p = attrs.begin(); p != attrs.end(); ++p )
  252.    {
  253.       set_attribute(p->first,p->second);
  254.    }
  255. }
  256. //-----------------------------------------------------------------------
  257. void xmlNode :: add_child_node(AnsiString child_name)const
  258. {
  259.    if(_node == NULL)return ;
  260.    _node->AddChild(child_name);
  261. }
  262. //-----------------------------------------------------------------------
  263. void xmlNode :: del_child_nodes()const
  264. {
  265.    if(_node == NULL)return ;
  266.    if(_node->HasChildNodes)
  267.    {
  268.       _node->ChildNodes->Clear();
  269.    }
  270. }
  271. //-----------------------------------------------------------------------
  272. void xmlNode :: del_child_node(AnsiString child_name)const
  273. {
  274.    if(_node == NULL)return ;
  275.    if(_node->HasChildNodes)
  276.    {
  277.       _node->ChildNodes->Delete( child_name );
  278.    }
  279. }
  280. //====
  281.