因为上一篇已经写好了添加XML的元素。现在写添加属性就依葫芦画瓢了。代码里面有些重复的地方,其实可以进行优化。
#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);
}
int main(){
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/ADDINTINONAL","tail","other spcifications");
xmlSaveFormatFileEnc("-",doc,"gb2312",1);
if(doc!=NULL)
xmlFreeDoc(doc);
return 0;
}