libxml2是一個c語言環境下生成和解析XML的一個工具,在Linux下安裝後,需要在編譯是指明庫/lib/local/include/libxml2,連接時添加參數-lxml2 -ldl -lm -lc。
在Linux的集成環境Eclipse下進行開發需要進行配置。選擇你要配置的工程,點擊Project->Properties,配置如下圖:
compiler配置
linker配置
然後可以開始編寫了:
我在這裏編寫了通過添加元素一個生成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("XNB"))!=0)
return;
AddElement(root_node,str_list,0,n,tag,ele);
}
int main(){
xmlDocPtr doc=NULL;
xmlNodePtr node=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");
xmlSaveFormatFileEnc("-",doc,"gb2312",1);
if(doc!=NULL)
xmlFreeDoc(doc);
return 0;
}