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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值