xml libxml2-xml 解析 http://sblig.iteye.com/blog/814323

xml数据结构: 
xmlChar:对char的基本代替,是一个UTF-8编码字符串中的一个字节 
xmlDoc 和 xmlDocPtr:  树的结构 
xmlNode 和 xmlNodePtr:单个节点的结构

生成xmldoc、获得根节点,获得子节点

C代码   收藏代码
  1. //4. 解析xml字符串  
  2. xmlDocPtr doc = xmlParseMemory(pXml, length);  
  3.    
  4. //根据xmldoc获得xml的根节点  
  5. xmlNodePtr cur = xmlDocGetRootElement(doc);  
  6.    
  7. //获得子节点:->children获得不是第一个子节点,必须用next才能获得第一个子节点  
  8. cur = cur->children;  
  9. cur = cur->next;  
  10.   
  11. // 获得节点信息中的内容: 注意释放资源  
  12. xmlChar* key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);  
  13. xmlFree(key);  
  14.   
  15. //获得节点信息属性的值:属性name,注意释放资源  
  16. xmlChar* fversion = xmlGetProp(cur, "version");  
  17. xmlFree(fversion);  
  18.   
  19.   
  20.   
  21. //根节点相关函数  
  22. xmlNodePtr xmlDocGetRootElement (xmlDocPtr doc) //获取文档根节点  
  23. xmlNodePtr xmlDocSetRootElement (xmlDocPtr doc, xmlNodePtr root) //设置文档根节点  
  24.   
  25. //创建子节点相关函数  
  26. xmlNodePtr xmlNewNode (xmlNsPtr ns, const xmlChar * name) //创建新节点  
  27. xmlNodePtr xmlNewChild (xmlNodePtr parent, xmlNsPtr ns, const xmlChar * name, const xmlChar * content) //创建新的子节点  
  28. xmlNodePtr xmlCopyNode (const xmlNodePtr node, int extended) //复制当前节点  
  29.   
  30. //添加子节点相关函数  
  31. xmlNodePtr xmlAddChild (xmlNodePtr parent, xmlNodePtr cur) //给指定节点添加子节点  
  32. xmlNodePtr xmlAddNextSibling (xmlNodePtr cur, xmlNodePtr elem) //添加后一个兄弟节点  
  33. xmlNodePtr xmlAddPrevSibling (xmlNodePtr cur, xmlNodePtr elem) //添加前一个兄弟节点  
  34. xmlNodePtr xmlAddSibling (xmlNodePtr cur, xmlNodePtr elem) //添加兄弟节点  
  35.   
  36. //属性相关函数  
  37. xmlAttrPtr    xmlNewProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) //创建新节点属性  
  38. xmlChar *    xmlGetProp (xmlNodePtr node, const xmlChar * name) //读取节点属性  
  39. xmlAttrPtr    xmlSetProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value) //设置节点属性  
  40.   
  41. =xmlNodeListGetstring(doc, cur->xmlChildrenNode, 1);  
  42. =xmlNodeContent(cur);  

 

对一个xmldoc解析解析

Cpp代码   收藏代码
  1. void CCommunicationThread::parseXml_doc(xmlDocPtr doc, xmlNodePtr cur, const char* path)  
  2. {  
  3.  //1.进入xml的目录时:判断该目录是否存在?否则创建  
  4.  cur = cur->children;  
  5.  if (cur == NULL)  
  6.  return;  
  7.    
  8.  cur = cur->next;  
  9.  if (cur == NULL)  
  10.  return;  
  11.    
  12.  check_and_create_path(path);  
  13.  SVN_MAP file_map;  
  14.  char* pMapBuffer = this->get_fileInfor_list(path, file_map);  
  15.    
  16.    
  17.  //2.将服务器的新版、新增文件信息,压入准备下载的队列,启动线程开始下载.  
  18.  xmlChar* fileName;  
  19.  xmlChar* fileVersion;  
  20.  SVN_MAP map_new;  
  21.    
  22.    
  23.  while ( cur != NULL)  
  24.  {  
  25.  if (strcmp((char*)cur->name, "folder") == 0)  
  26.  {  
  27.  string curPath = path;  
  28.  fileName = xmlGetProp(cur, (const xmlChar *)"name");  
  29.  curPath = curPath + "\\" + (char*)fileName;  
  30.    
  31.  parseXml_doc(doc, cur, curPath.c_str());  
  32.  }  
  33.  else if (strcmp((char*)cur->name, "file") == 0)  
  34.  {  
  35.  // 判断一个文件是否存在?文件是否修改?文件版本号是否与当前的版本号相同?  
  36.  fileName = xmlGetProp(cur, (const xmlChar *)"name");  
  37.  fileVersion = xmlGetProp(cur, (const xmlChar *)"version");  
  38.    
  39.  FILE_SVN_INFOR* svn_infor = new FILE_SVN_INFOR;  
  40.  strcpy(svn_infor->filename, (const char*)fileName);  
  41.  svn_infor->version = 0;  
  42.    
  43.  SVN_MAP::iterator it = file_map.find((char*)fileName);  
  44.  if (it != file_map.end())  
  45.  {  
  46.  // 找到该信息,查看版本号  
  47.  if (atoi((const char*)fileVersion) > it->second->version)//新版本  
  48.  {  
  49.  File_Infor* infor = new File_Infor();  
  50.  strcpy(infor->command, CMD_DOWNLOAD);  
  51.  strcpy(infor->param.download.fileName, (const char*)fileName);  
  52.  this->push_list(infor);  
  53.  }  
  54.    
  55.  svn_infor->md5 = it->second->md5;  
  56.  }  
  57.  else  
  58.  {  
  59.  // 新增   
  60.  File_Infor* infor = new File_Infor();  
  61.  strcpy(infor->command, CMD_DOWNLOAD);  
  62.  strcpy(infor->param.download.fileName, (const char*)fileName);  
  63.  this->push_list(infor);  
  64.    
  65.  memset(&svn_infor->md5, 0, sizeof(MD5));  
  66.  }  
  67.    
  68.    
  69.  // 组织新的.svn文件  
  70.  map_new[svn_infor->filename] = svn_infor;  
  71.    
  72.  xmlFree(fileName);  
  73.  xmlFree(fileVersion);  
  74.  }  
  75.  cur = cur->next;  
  76.  }  
  77.    
  78.  //3.在退出xml目录时:根据文件新的版本存储.svn文件  
  79.  free(pMapBuffer);  
  80.  set_fileInfor_list(path, map_new);  
  81.  for ( SVN_MAP::iterator it = map_new.begin(); it != map_new.end(); it++ )  
  82.  {  
  83.  delete it->second;   
  84.  }  
  85.  map_new.clear();  
  86.    
  87.  return;  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写php服务的dockerfile文档,满足如下要求: 1)基础镜像:centos:7 2)作者信息:姓名首字母 3)下载gcc gcc-c++ gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel make perl 4)将本地文件libzip-1.2.0.tar.gz解压并复制到容器中的/tmp中 5)通过以下命令对libzip进行配置编译: cd /tmp/libzip-1.2.0 && ./configure && make && make install 6)在容器中复制并解压文件php-7.3.9.tar.gz到/tmp文件夹中,然后进入到/tmp/php-7.3.9文件夹下,并通过以下命令进行编译: ./configure --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php/etc \ --with-mysql --with-mysqli \ --with-openssl --with-zlib --with-curl --with-gd \ --with-jpeg-dir --with-png-dir --with-iconv \ --enable-fpm --enable-zip --enable-mbstring 6)在容器中将/usr/local/lib/libzip/include/zipconf.h文件复制到 /usr/local/include/文件加下 7)继续进行编译make -j 4 && make install 8)在容器中将/usr/local/php/etc/php-fpm.conf.default文件复制为 /usr/local/php/etc/php-fpm.conf文件 9)在容器中将文件/usr/local/php/etc/php-fpm.d/www.conf.default 复制成/usr/local/php/etc/php-fpm.d/www.conf 文件 10)在容器中修改/usr/local/php/etc/php-fpm.d/www.conf文件中的127.0.0.1为0.0.0.0 11)在容器中复制./sapi/fpm/init.d.php-fpm文件成 /etc/init.d/php-fpm文件 12)在容器中修改/etc/init.d/php-fpm权限为可执行 13)端口9000 14)在容器启动时执行命令:/etc/init.d/php-fpm start && tail -F /var/log/messages
最新发布
06-09

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值