struct 互转 xml

/** struct2xml.c */

#include <stdio.h>
#include <unistd.h>
#include "soapStub.h"
#include "soapH.h"
#include "nsmap.h"

/**
 * struct2xml: transfer struct to xml 
 * strname: the struct name
 * strvar: a struct instance name
 * xmlbuf: buffer store the result
 * buflen: buffer size
 */
#define struct2xml(strname, strvar, xmlbuf, buflen)	\
	do {						\
		struct soap soap = {0};			\
		struct strname *param = &strvar;	\
		int pfd[2];				\
		if (pipe(pfd))				\
			break;				\
		soap_init(&soap);			\
		soap.sendfd = pfd[1];			\
		soap_write_PointerTo##strname(&soap, (struct strname * const*) &param); \
		read(pfd[0], xmlbuf, buflen - 1);	\
		close(pfd[0]);				\
		close(pfd[1]);				\
		soap_destroy(&soap);			\
		soap_end(&soap);			\
		soap_done(&soap);			\
	} while (0)

int main(int argc, char *argv[])
{
	struct RequestUpdate req = {0};
	snprintf(req.Action, sizeof(req.Action), "%s", "Action");
	snprintf(req.Auth.Username, sizeof(req.Auth.Username), "%s", "Username");
	snprintf(req.Auth.Password, sizeof(req.Auth.Password), "%s", "Password");
	snprintf(req.Auth.Createtm, sizeof(req.Auth.Createtm), "%s", "Createtm");
	snprintf(req.Auth.Nonce, sizeof(req.Auth.Nonce), "%s", "Nonce");
	snprintf(req.DevInfo.Product, sizeof(req.DevInfo.Product), "%s", "Product");
	snprintf(req.DevInfo.Firmware, sizeof(req.DevInfo.Firmware), "%s", "Firmware");
	snprintf(req.DevInfo.SN, sizeof(req.DevInfo.SN), "%s", "SN");

	char xmldata[2048] = {0};
	int xmlsize = sizeof(xmldata);

	struct2xml(RequestUpdate, req, xmldata, sizeof(xmldata));
	printf("%s\n", xmldata);

	return 0;
}



/** xml2struct.c */

#include <stdio.h>
#include <string.h>
#include "soapStub.h"
#include "soapH.h"
#include "nsmap.h"

/**
 * xml2struct: transfer xml to struct
 * strname: the struct name
 * strvar: a struct instance name
 * xmlbuf: xml string 
 */
#define xml2struct(strname, strvar, xmlbuf)				\
	do {								\
		struct soap soap;					\
		int pfd[2];						\
		if (pipe(pfd))						\
			break;						\
		write(pfd[1], xmlbuf, strlen(xmlbuf));			\
		soap_init(&soap);					\
		soap_begin(&soap);					\
		soap.recvfd = pfd[0];					\
		soap_begin_recv(&soap);					\
		if (!soap_get_##strname(&soap, &strvar, NULL, NULL))	\
			memset(&strvar, 0, sizeof(struct strname));	\
		soap_end_recv(&soap);					\
		soap_destroy(&soap);					\
		soap_end(&soap);					\
		soap_done(&soap);					\
		close(pfd[0]);						\
		close(pfd[1]);						\
	} while (0)

int main()
{
	char *xmldata = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<RequestUpdate><Action>Action</Action><Auth><Username>Username</Username><Password>Password</Password><Createtm>Createtm</Createtm><Nonce>Nonce</Nonce></Auth><DevInfo><Product>Product</Product><Firmware>Firmware</Firmware><SN>SN</SN></DevInfo></RequestUpdate>";

	struct RequestUpdate req = {0};
	xml2struct(RequestUpdate, req, xmldata);
	
	printf("%s,%s,%s,%s,%s,%s,%s,%s\n", req.Action, req.Auth.Username, req.Auth.Password, req.Auth.Createtm, req.Auth.Nonce, req.DevInfo.Product, req.DevInfo.Firmware, req.DevInfo.SN);
	return 0;
}


完整代码查看: https://github.com/willalways/struct-xml

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言中的struct和其他数据类型之间的转换可以通过类型转换来实现。在转换过程中,需要注意两个结构体之间的字段名和字段类型要匹配。 例如,有两个结构体Student和Person,它们的定义如下: ```go type Student struct { Name string Age int Grade int } type Person struct { Name string Age int } ``` 如果要将一个Student类型的对象转换为Person类型的对象,需要创建一个新的Person对象,然后将Student对象中的字段值赋给Person对象中对应的字段。可以通过如下方式进行转换: ```go func ConvertStudentToPerson(student Student) Person { person := Person{ Name: student.Name, Age: student.Age, } return person } ``` 同样地,可以定义一个函数将Person类型的对象转换为Student类型的对象,方法也类似。 在实际应用中,如果两个结构体之间的字段名称和类型完全一致,也可以直接使用类型转换运算符进行转换。例如: ```go func main() { student := Student{ Name: "张三", Age: 18, Grade: 3, } person := Person(student) // 直接使用类型转换运算符将Student类型转换为Person类型 fmt.Println(person) } ``` 上述代码中,将Student类型的对象通过类型转换运算符转换为Person类型的对象,并打印出结果。 需要注意的是,结构体之间的转换只能在字段名称和类型完全匹配的情况下进行,否则会编译错误。另外,在进行转换时需要确保数据类型的一致性,避免出现错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值