LIBXML學習(1)--添加元素

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;
}

發佈了50 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章