xml数据结构: xmlChar:对char的基本代替,是一个UTF-8编码字符串中的一个字节 xmlDoc 和 xmlDocPtr: 树的结构 xmlNode 和 xmlNodePtr:单个节点的结构
生成xmldoc、获得根节点,获得子节点
-
- xmlDocPtrdoc=xmlParseMemory(pXml,length);
-
- //根据xmldoc获得xml的根节点
- xmlNodePtrcur=xmlDocGetRootElement(doc);
- //获得子节点:->children获得不是第一个子节点,必须用next才能获得第一个子节点
- cur=cur->children;
- cur=cur->next;
- //获得节点信息中的内容:注意释放资源
- xmlChar*key=xmlNodeListGetString(doc,cur->xmlChildrenNode,1);
- xmlFree(key);
- //获得节点信息属性的值:属性name,注意释放资源
- xmlChar*fversion=xmlGetProp(cur,"version");
- xmlFree(fversion);
- //根节点相关函数
- xmlNodePtrxmlDocGetRootElement(xmlDocPtrdoc)
- xmlNodePtrxmlDocSetRootElement(xmlDocPtrdoc,xmlNodePtrroot)
- //创建子节点相关函数
- xmlNodePtrxmlNewNode(xmlNsPtrns,constxmlChar*name)
- xmlNodePtrxmlNewChild(xmlNodePtrparent,xmlNsPtrns,85); font-weight:bold">constxmlChar*name,85); font-weight:bold">constxmlChar*content)
- xmlNodePtrxmlCopyNode(constxmlNodePtrnode,intextended)
- //添加子节点相关函数
- xmlNodePtrxmlAddChild(xmlNodePtrparent,xmlNodePtrcur)
- xmlNodePtrxmlAddNextSibling(xmlNodePtrcur,xmlNodePtrelem)
- xmlNodePtrxmlAddPrevSibling(xmlNodePtrcur,0); padding:0px; margin:0px; width:auto; border:0px">//添加前一个兄弟节点
- xmlNodePtrxmlAddSibling(xmlNodePtrcur,0); padding:0px; margin:0px; width:auto; border:0px">//添加兄弟节点
- //属性相关函数
- xmlAttrPtrxmlNewProp(xmlNodePtrnode,85); font-weight:bold">constxmlChar*value)
- xmlChar*xmlGetProp(xmlNodePtrnode,0); padding:0px; margin:0px; width:auto; border:0px">//读取节点属性
- xmlAttrPtrxmlSetProp(xmlNodePtrnode,0); padding:0px; margin:0px; width:auto; border:0px">//设置节点属性
- =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();
}
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|