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

xml/soap/webservice

开发平台:

C++ Builder

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