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

前端之家收集整理的这篇文章主要介绍了xml libxml2-xml 解析 http://sblig.iteye.com/blog/814323前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

  1. //4.解析xml字符串
  2. xmlDocPtrdoc=xmlParseMemory(pXml,length);
  3. //根据xmldoc获得xml的根节点
  4. xmlNodePtrcur=xmlDocGetRootElement(doc);
  5. //获得子节点:->children获得不是第一个子节点,必须用next才能获得第一个子节点
  6. cur=cur->children;
  7. cur=cur->next;
  8. //获得节点信息中的内容:注意释放资源
  9. xmlChar*key=xmlNodeListGetString(doc,cur->xmlChildrenNode,1);
  10. xmlFree(key);
  11. //获得节点信息属性的值:属性name,注意释放资源
  12. xmlChar*fversion=xmlGetProp(cur,"version");
  13. xmlFree(fversion);
  14. //根节点相关函数
  15. xmlNodePtrxmlDocGetRootElement(xmlDocPtrdoc)//获取文档根节点
  16. xmlNodePtrxmlDocSetRootElement(xmlDocPtrdoc,xmlNodePtrroot)//设置文档根节点
  17. //创建子节点相关函数
  18. xmlNodePtrxmlNewNode(xmlNsPtrns,constxmlChar*name)//创建新节点
  19. xmlNodePtrxmlNewChild(xmlNodePtrparent,xmlNsPtrns,85); font-weight:bold">constxmlChar*name,85); font-weight:bold">constxmlChar*content)//创建新的子节点
  20. xmlNodePtrxmlCopyNode(constxmlNodePtrnode,intextended)//复制当前节点
  21. //添加子节点相关函数
  22. xmlNodePtrxmlAddChild(xmlNodePtrparent,xmlNodePtrcur)//给指定节点添加子节点
  23. xmlNodePtrxmlAddNextSibling(xmlNodePtrcur,xmlNodePtrelem)//添加后一个兄弟节点
  24. xmlNodePtrxmlAddPrevSibling(xmlNodePtrcur,0); padding:0px; margin:0px; width:auto; border:0px">//添加前一个兄弟节点
  25. xmlNodePtrxmlAddSibling(xmlNodePtrcur,0); padding:0px; margin:0px; width:auto; border:0px">//添加兄弟节点
  26. //属性相关函数
  27. xmlAttrPtrxmlNewProp(xmlNodePtrnode,85); font-weight:bold">constxmlChar*value)//创建新节点属性
  28. xmlChar*xmlGetProp(xmlNodePtrnode,0); padding:0px; margin:0px; width:auto; border:0px">//读取节点属性
  29. xmlAttrPtrxmlSetProp(xmlNodePtrnode,0); padding:0px; margin:0px; width:auto; border:0px">//设置节点属性
  30. =xmlNodeListGetstring(doc,250)"> =xmlNodeContent(cur);

对一个xmldoc解析解析

Cpp代码 voidCCommunicationThread::parseXml_doc(xmlDocPtrdoc,xmlNodePtrcur,85); font-weight:bold">constchar*path)
  • {
  • //1.进入xml的目录时:判断该目录是否存在?否则创建
  • if(cur==NULL)
  • return;
  • check_and_create_path(path);
  • SVN_MAPfile_map;
  • char*pMapBuffer=this->get_fileInfor_list(path,file_map);
  • //2.将服务器的新版、新增文件信息,压入准备下载的队列,启动线程开始下载.
  • xmlChar*fileName;
  • xmlChar*fileVersion;
  • SVN_MAPmap_new;
  • while(cur!=NULL)
  • if(strcmp((char*)cur->name,"folder")==0)
  • stringcurPath=path;
  • fileName=xmlGetProp(cur,(constxmlChar*)"name");
  • curPath=curPath+"\\"+(char*)fileName;
  • parseXml_doc(doc,cur,curPath.c_str());
  • }
  • else"file")==0)
  • //判断一个文件是否存在?文件是否修改文件版本号是否与当前的版本号相同?
  • fileVersion=xmlGetProp(cur,85); font-weight:bold">constxmlChar*)"version");
  • FILE_SVN_INFOR*svn_infor=newFILE_SVN_INFOR;
  • strcpy(svn_infor->filename,87); font-weight:bold">char*)fileName);
  • svn_infor->version=0;
  • SVN_MAP::iteratorit=file_map.find((if(it!=file_map.end())
  • //找到该信息,查看版本号
  • if(atoi((char*)fileVersion)>it->second->version)//新版本
  • File_Infor*infor=newFile_Infor();
  • strcpy(infor->command,CMD_DOWNLOAD);
  • strcpy(infor->param.download.fileName,85); font-weight:bold">this->push_list(infor);
  • svn_infor->md5=it->second->md5;
  • else
  • //新增
  • memset(&svn_infor->md5,85); font-weight:bold">sizeof(MD5));
  • //组织新的.svn文件
  • map_new[svn_infor->filename]=svn_infor;
  • xmlFree(fileName);
  • xmlFree(fileVersion);
  • //3.在退出xml目录时:根据文件新的版本存储.svn文件
  • free(pMapBuffer);
  • set_fileInfor_list(path,map_new);
  • for(SVN_MAP::iteratorit=map_new.begin();it!=map_new.end();it++)
  • deleteit->second;
  • map_new.clear();
  • }
  • 猜你在找的XML相关文章