代码先贴在这里。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<libxml/tree.h>
#include<libxml/parser.h>
int str_split(char *str,char str_list[][256]){
int i,j=0,k=0;
int len=strlen(str);
for(i=1;i<len;i++){
if(str[i]=='/'){
j++;
k=0;
}
else
str_list[j][k++]=str[i];
}
if(i==len)
return j+1;
return j;
}
//调用AddElement(root_node,str_list,0,n,tag,ele);
void AddElement(xmlNodePtr node,char str_list[][256],int depth,int n,char *tag,char *ele){
xmlNodePtr cur,parent_node,temp_node;
int find=0;
for(cur=node;cur;cur=cur->next)
if(xmlStrcmp(cur->name,BAD_CAST(str_list[depth]))==0){
find=1;
if(cur->children!=NULL){
AddElement(cur->children,str_list,depth+1,n,tag,ele);
return;
}
break;
}
//如果当前节点不一致
if(!find){
parent_node=node->parent;
if(depth==n){
xmlNewChild(parent_node,NULL,BAD_CAST(tag),BAD_CAST(ele));
return;
}
temp_node=xmlNewNode(NULL,BAD_CAST(str_list[depth]));
xmlAddChild(parent_node,temp_node);
parent_node=temp_node;
}
else//字节点为空
parent_node=node;
depth++;
while(depth!=n){
temp_node=xmlNewNode(NULL,BAD_CAST(str_list[depth]));
xmlAddChild(parent_node,temp_node);
parent_node=temp_node;
depth++;
}
xmlNewChild(parent_node,NULL,BAD_CAST(tag),BAD_CAST(ele));
}
void XmlAddElement(xmlDocPtr doc,char *str,char *tag,char *ele){
//先拆分字符串
char str_list[16][256];
int n=0; //拆分出的字符串个数
xmlNodePtr root_node=NULL;
memset(str_list,0,sizeof(str_list));
n=str_split(str,str_list);
root_node=xmlDocGetRootElement(doc);
if(root_node==NULL){
root_node=xmlNewNode(NULL,BAD_CAST(str_list[0]));
xmlDocSetRootElement(doc,root_node);
}
else
root_node=xmlDocGetRootElement(doc);
//根节点要一致
if(xmlStrcmp(root_node->name,BAD_CAST(str_list[0]))!=0)
return;
AddElement(root_node,str_list,0,n,tag,ele);
}
void AddAttribute(xmlNodePtr node,char str_list[][256],int depth,int n,char *attribute,char *value){
xmlNodePtr cur=NULL,parent_node=NULL,temp_node=NULL;
int find=0;
for(cur=node;cur;cur=cur->next){
if(xmlStrcmp(cur->name,BAD_CAST(str_list[depth]))==0){
find=1;
if(depth==n-1){//最后一个位置添加属性
xmlNewProp(cur,BAD_CAST(attribute),BAD_CAST(value));
return;
}
if(cur->children!=NULL){
AddAttribute(cur->children,str_list,depth+1,n,attribute,value);
return;
}
//标签有些不匹配
break;
}
}
//如果当前节点不匹配,测添加一个标签
if(!find){
parent_node=node->parent;
temp_node=xmlNewNode(NULL,BAD_CAST(str_list[depth]));
xmlAddChild(parent_node,temp_node);
parent_node=temp_node;
}
else//当前节点的字节点为空
parent_node=node;
depth++;
temp_node=parent_node;
while(depth<n){
temp_node=xmlNewNode(NULL,BAD_CAST(str_list[depth]));
xmlAddChild(parent_node,temp_node);
parent_node=temp_node;
depth++;
}
xmlNewProp(temp_node,BAD_CAST(attribute),BAD_CAST(value));
}
void XmlAddAttribute(xmlDocPtr doc,char *str,char *attribute,char *value){
char str_list[16][256];
int n=0;
xmlNodePtr root_node=NULL;
memset(str_list,0,sizeof(str_list));
n=str_split(str,str_list);
root_node=xmlDocGetRootElement(doc);
if(root_node==NULL){
root_node=xmlNewNode(NULL,BAD_CAST(str_list[0]));
xmlDocSetRootElement(doc,root_node);
}
else
root_node=xmlDocGetRootElement(doc);
//根节点要一致
if(xmlStrcmp(root_node->name,BAD_CAST(str_list[0]))!=0)
return;
AddAttribute(root_node,str_list,0,n,attribute,value);
}
void GetText(xmlNodePtr node,char str_list[][256],int depth,int n,char *buffer){
xmlNodePtr cur;
for(cur=node;cur;cur=cur->next){
if(xmlStrcmp(cur->name,BAD_CAST(str_list[depth]))==0){
if(depth==n-1){
strcpy(buffer,(char *)xmlNodeGetContent(cur));
return;
}
GetText(cur->children,str_list,depth+1,n,buffer);
}
}
}
void GetXmlText(xmlDocPtr doc,char *str,char *buffer){
char str_list[16][256];
int n=0;
xmlNodePtr root_node=NULL;
memset(str_list,0,sizeof(str_list));
n=str_split(str,str_list);
root_node=xmlDocGetRootElement(doc);
if(root_node==NULL)
return;
GetText(root_node,str_list,0,n,buffer);
}
void GetAttribute(xmlNodePtr node,char str_list[][256],int depth,int n,char *attribute,char *value){
xmlNodePtr cur;
for(cur=node;cur;cur=cur->next){
if(xmlStrcmp(cur->name,BAD_CAST(str_list[depth]))==0){
if(depth==n-1){
strcpy(value,(char *)xmlGetProp(cur,BAD_CAST(attribute)));
return;
}
if(cur->children==NULL)
return;
GetAttribute(cur->children,str_list,depth+1,n,attribute,value);
return;
}
}
}
void GetXmlAttribute(xmlDocPtr doc,char *str,char *attribute,char *value){
char str_list[16][256];
int n=0;
xmlNodePtr root_node=NULL;
memset(str_list,0,sizeof(str_list));
n=str_split(str,str_list);
root_node=xmlDocGetRootElement(doc);
if(root_node==NULL)
return;
GetAttribute(root_node,str_list,0,n,attribute,value);
}
int main(){
char buffer[256];
xmlDocPtr doc=NULL;
doc=xmlNewDoc(BAD_CAST("1.0"));
XmlAddElement(doc,"/XNB/PUB","JYRQ","2012-11-04");
XmlAddElement(doc,"/XNB/PUB","DWBM","999");
XmlAddElement(doc,"/XNB/RSP","JYDM","CX01");
XmlAddElement(doc,"/XNB/RSP","YHLSH","21234123413241324");
XmlAddElement(doc,"/XNB/RSP/ROW","JFZTSFZH","430181198910132257");
XmlAddElement(doc,"/XNB/RSP/ROW","ZXLX","xinnongbao");
XmlAddAttribute(doc,"/XNB/RSP/ROW","name","first");
XmlAddAttribute(doc,"/XNB/RSP/ROW/ZXLX","zxlx","10");
XmlAddAttribute(doc,"/XNB/FINAL/ADDITIONAL","tail","other spcifications");
xmlSaveFormatFileEnc("-",doc,"gb2312",1);
memset(buffer,0,sizeof(buffer));
GetXmlText(doc,"/XNB/PUB/JYRQ",buffer);
printf("%s\n",buffer);
memset(buffer,0,sizeof(buffer));
GetXmlText(doc,"/XNB/FINAL/ADDITIONAL",buffer);
printf("%s\n",buffer);
memset(buffer,0,sizeof(buffer));
GetXmlText(doc,"/XNB/RSP/ROW/JFZTSFZH",buffer);
printf("%s\n",buffer);
memset(buffer,0,sizeof(buffer));
GetXmlAttribute(doc,"/XNB/RSP/ROW/ZXLX","zxlx",buffer);
printf("%s\n",buffer);
memset(buffer,0,sizeof(buffer));
GetXmlAttribute(doc,"/XNB/FINAL/ADDITIONAL","tail",buffer);
printf("%s\n",buffer);
if(doc!=NULL)
xmlFreeDoc(doc);
return 0;
}