MangeXml.cpp.svn-base
上传用户:szjkjd
上传日期:2022-06-27
资源大小:8968k
文件大小:10k
源码类别:

浏览器

开发平台:

Visual C++

  1. /*! @mangexml.cpp
  2. *******************************************************************************
  3. <PRE>
  4. 模块名         : 对XM文件的操作
  5. 文件名         : mangexml.cpp
  6. 相关文件       : mangexml.hxml.c,iconv.dll,libxml2.dll,zlib1.dll,iconv.lib,libxml2.lib,
  7.                : odbc32.lib,odbccp32.lib,iconv.h,以及iconv-1.9.2.win32、libxml2-2.7.6.win32库
  8. 文件实现功能   : 对XM文件的操作,包括文件的创建、增加、删除、修改、查询。
  9. 作者           : 王小静
  10. 版本           : 1.0
  11. --------------------------------------------------------------------------------
  12. 备注           : -
  13. --------------------------------------------------------------------------------
  14. 修改记录 : 
  15. 日  期          版本            修改人          修改内容 
  16. 2010/02/08      1.0             王小静            创建
  17. 2010/03/01      1.1             王小静 修改ChangwXml函数,实现修改
  18. </PRE>
  19. ********************************************************************************
  20. * 版权所有(c) 2010, 17jago, 保留所有权利
  21. *******************************************************************************/
  22. #include "stdafx.h"
  23. #include ".mangexml.h"
  24. #include "xml.h"
  25. #include "stdio.h"
  26. #include "stdlib.h"
  27. #include "string.h"
  28. //构造函数
  29. CMangeXml::CMangeXml(void)
  30. {
  31. }
  32. //析构函数
  33. CMangeXml::~CMangeXml(void)
  34. {
  35. }
  36. /*! @CreateXml
  37. ************************************************************************************** <PRE> 函数名       : CreateXml 功能         : 创建一个xml文件 参数         : [IN] filename    : 创建文件的名字,包括文件的所在路径              : [IN] encoding    : 文件的编码格式              : [IN] root        : xml文件的根目录 返回值       : 成功返回创建的true, 失败返回false -------------------------------------------------------------------------------- 备注         : -
  38. 典型用法     : -
  39. --------------------------------------------------------------------------------
  40. 作者         : 王小静
  41. </PRE> *************************************************************************************/
  42. bool CMangeXml::CreateXml(const char* filename, const char* encoding, const char* root)
  43. {
  44.     //定义结构体变量
  45. TXML *p_xml;
  46. //创建文件
  47. p_xml = xml_create(filename,encoding,root);
  48. //判断是否创建成功,为NULL失败
  49. if(p_xml == NULL)
  50. {
  51. return false;
  52. }
  53.     //判断是否保存成功
  54. int i_save = 0;
  55. if((i_save = xml_save_close(p_xml)) != 0)
  56. {
  57. return false;
  58. }
  59. //创建文件的返回值
  60. return true;
  61. }
  62. /*! @AddXml
  63. ************************************************************************************* <PRE> 函数名       : AddXml 功能         : 在已经存在xml文件中添加数据 参数  : [IN] filename    : 文件的名字,包括文件的所在路径              : [IN] XPath       : 添加xml文件的路径,              : [IN] index       : 添加数据数据节点序号,节点起始位置是1              : [IN] name : xml中添加名称              : [IN] value       : xml的内容 返回值       : 成功返回0, 失败返回-1 -------------------------------------------------------------------------------- 备注         : -
  64. 典型用法     : -
  65. --------------------------------------------------------------------------------
  66. 作者         : 王小静
  67. </PRE> *************************************************************************************/
  68. int CMangeXml::AddXml(const char * filename, const char * xpath, const int index , const char* name,  const char* value)
  69. {
  70. TXML *p_myxml;  
  71. //保存xpath和index的拼接结果
  72. char p_temp[1024] = {0};
  73. //打开已经存在的xml文件
  74. p_myxml =xml_create_file(filename); 
  75. //是否打开成功判断
  76. if(p_myxml == NULL)                  
  77. {
  78. return -1;
  79. }
  80.  //将index与xpath相结合,保证最后匹配的字段只有一个。
  81.  //节点位置判断
  82.      if(index <= 0)                   
  83. {
  84. //index无效,直接赋值给p_temp
  85.  sprintf(p_temp,"%s",xpath);     
  86. }
  87.  else
  88.  {
  89. //拼接xpath和index
  90.  sprintf(p_temp,"%s[%d]",xpath,index);
  91.  }
  92.      
  93. //添加数据是否成功判断
  94. if((xml_add_child(p_myxml,p_temp,name,value,NULL)) != 0 )
  95. {
  96. //关闭已经打开的xml文件
  97. xml_save_close(p_myxml);   
  98. return -1;
  99. }
  100. //关闭已经打开的xml文件
  101. xml_save_close(p_myxml);   
  102. return 0;
  103. }
  104. /*! @DeleteXml
  105. ************************************************************************************* <PRE> 函数名       : DeleteXml 功能         : 在已经存在xml文件删除满足条件的数据 参数         : [IN] filename    : 文件的名字,包括文件的所在路径              : [IN] XPath       : 删除xml文件的路径              : [IN] index       : 删除数据节点序号,节点起始位置是1 返回值       : 成功返回true, 失败返回false ------------------------------------------------------------------------------------- 备注         : -
  106. 典型用法     : -
  107. -------------------------------------------------------------------------------------
  108. 作者         : 王小静
  109. </PRE> *************************************************************************************/
  110. bool CMangeXml::DeleteXml(const char * filename, const char * xpath,const int index)
  111. {
  112. TXML * m_dxml;
  113. //打开已经存在xml文件
  114.     m_dxml = xml_create_file(filename); 
  115. //判断是否打开成功
  116. if(m_dxml == NULL)
  117. {
  118.        return false;
  119. }
  120. //将index与xpath结合,保证匹配唯一
  121. char xpath_tmp[1024] = {0};
  122. if(index <= 0)
  123. {
  124. sprintf(xpath_tmp,"%s",xpath);
  125. }
  126. sprintf(xpath_tmp,"%s[%d]",xpath,index);
  127.     
  128. //删除xml文件中满足条件的数据
  129.     if((xml_remove(m_dxml,xpath_tmp)) != 0)
  130. {
  131. //失败则关闭文件
  132. xml_close(m_dxml);  
  133. return false;
  134. }
  135. //成功则保存并关闭文件
  136. xml_save_close(m_dxml); 
  137. return true;
  138. }
  139. /*! @ReadXml
  140. ************************************************************************************* 函数名       : ReadXml 功能         : 在已经存在xml文件中读取满足条件的数据 参数         : [IN] filename    : 文件的名字,包括文件的所在路径              : [IN] XPath       : 查询xml文件的路径              : [IN] index       : 查询数据节点序号,节点起始位置是0 返回值       : 成功返回字符串获得的字符串, 失败返回NULL ------------------------------------------------------------------------------------- 备注         : 始终处于打开状态,最后应用CloseXml关闭保存文件    
  141. 典型用法     : -
  142. -------------------------------------------------------------------------------------
  143. 作者         : 王小静
  144. </PRE> *************************************************************************************/
  145. TXML *  CMangeXml::ReadXml(const char * filename, const char * xpath, const int index)
  146. {
  147. TXML * p_readXml;
  148. //查询得到的内容
  149. char *str;
  150. //打开xml文件
  151. if((p_readXml = xml_create_file(filename)) == NULL)   
  152. {
  153. return NULL;
  154. }
  155. int count;
  156. //获得满足xpath的节点数目
  157. if((count = xml_select_nodes(p_readXml,xpath)) == -1)   
  158. {
  159. //失败的关闭文件
  160. xml_close(p_readXml);       
  161. return NULL;
  162. }
  163.  //获得由xpath和index确定的节点的内容
  164.      if((str = xml_read_set_content(p_readXml,index)) == NULL)    
  165.  {
  166.  xml_close(p_readXml);
  167.  return NULL;
  168.  }
  169.  //指针初始化
  170.  p_con =  (char *)malloc(sizeof(char) * 1024);
  171.  //赋值给全局变量,做参数返回
  172.  sprintf(p_con,"%s",str);
  173.  //返回打开的xml
  174.  return p_readXml;
  175. }
  176. /*! @Changexml
  177. ************************************************************************************* * 函数名       : Changexml * 功能         : 在已经存在xml文件修改满足条件的数据 * 参数         : [IN] filename    : 文件的名字,包括文件的所在路径 *              : [IN] XPath       : xml文件的路径 *              : [IN] index       : 读数据节点序号,节点起始位置是0 *              : [IN] name        : 修要修改的属性名 *              : [IN] value       : 需要修改的xml内容 * 返回值       : 成功返回true, 失败返回false ------------------------------------------------------------------------------------- 备注           : -
  178. 典型用法       : -
  179. -------------------------------------------------------------------------------------
  180. 作者           : 王小静
  181. </PRE> *************************************************************************************/
  182. bool CMangeXml::Changexml(const char * filename, const char * xpath, const int index, const char * name, const char * value)
  183. {
  184. TXML *  Changexml;
  185. //打开xml文件
  186. if((Changexml = xml_create_file(filename)) == NULL)   
  187. {
  188. return NULL;
  189. }
  190. //获取个数
  191. int index_tmp = index_tmp = xml_select_nodes(Changexml,xpath);
  192. //判断失败,关闭保存返回
  193. if(-1 == index_tmp)
  194. {
  195. xml_save_close(Changexml);
  196. return false ;
  197. }
  198. //修改xml文件
  199. if(0 != (xml_write_set_content(Changexml,index,value)))
  200. {
  201. xml_save_close(Changexml);
  202. return false ;
  203. }
  204. //保存并关闭文件
  205. xml_save_close(Changexml); 
  206. return true;
  207. }
  208. /*! @CloseXml
  209. ************************************************************************************* 函数名       : CloseXml 功能         : 关闭已经打开的xml文件 参数         : [IN] xml    : 打开的xml文件 返回值       : - ------------------------------------------------------------------------------------- 备注         : -
  210. 典型用法     : -
  211. -------------------------------------------------------------------------------------
  212. 作者         : 王小静
  213. </PRE> *************************************************************************************/
  214. void CMangeXml::CloseXml(TXML * xml)
  215. {
  216. //关闭xml
  217. xml_close(xml);
  218. }
  219. /*! @SumXmlNodes
  220. ************************************************************************************* 函数名       : SumXmlNodes 功能         : 获得符合xpath的节点个数 参数         : [IN] filename    : 文件的名字,包括文件的所在路径              ; [IN] XPath       : xml文件的路径 返回值       : 成功返回获得结点个数, 失败返回-1 ------------------------------------------------------------------------------------- 备注         : -
  221. 典型用法     : -
  222. -------------------------------------------------------------------------------------
  223. 作者         : 王小静
  224. </PRE> *************************************************************************************/
  225. int CMangeXml::SumXmlNodes(const char * filename, const char * xpath)
  226. {
  227. //xml变量
  228. TXML *pSumxml;
  229. //打开 xml
  230. pSumxml = xml_create_file(filename);
  231. if( pSumxml == NULL)
  232. {
  233. return -1;
  234. }
  235. //xpath的个数
  236. int iSumNode = xml_select_nodes(pSumxml,xpath);
  237. //失败为-1
  238. if(iSumNode == -1 )
  239. {
  240. xml_close(pSumxml);
  241. return -1;
  242. }
  243. xml_close(pSumxml);
  244. return iSumNode;
  245. }