xml转c 语言结构体,struct 互转 xml

/** struct2xml.c */

#include

#include

#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],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),"Username");

snprintf(req.Auth.Password,sizeof(req.Auth.Password),"Password");

snprintf(req.Auth.Createtm,sizeof(req.Auth.Createtm),"Createtm");

snprintf(req.Auth.Nonce,sizeof(req.Auth.Nonce),"Nonce");

snprintf(req.DevInfo.Product,sizeof(req.DevInfo.Product),"Product");

snprintf(req.DevInfo.Firmware,sizeof(req.DevInfo.Firmware),"Firmware");

snprintf(req.DevInfo.SN,sizeof(req.DevInfo.SN),"SN");

char xmldata[2048] = {0};

int xmlsize = sizeof(xmldata);

struct2xml(RequestUpdate,req,xmldata,sizeof(xmldata));

printf("%s\n",xmldata);

return 0;

}

/** xml2struct.c */

#include

#include

#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,xmlbuf)\

do {\

struct soap soap;\

int pfd[2];\

if (pipe(pfd))\

break;\

write(pfd[1],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,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\"?>\nActionUsernamePasswordCreatetmNonceProductFirmwareSN";

struct RequestUpdate req = {0};

xml2struct(RequestUpdate,xmldata);

printf("%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

总结

以上是编程之家为你收集整理的struct 互转 xml全部内容,希望文章能够帮你解决struct 互转 xml所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用开源的库来解析 XML 文件并将其换为 C 语言结构体。一个常用的库是 libxml2。 以下是一个简单的示例代码,演示如何使用 libxml2 解析 XML 文件并将其换为结构体: ```c #include <stdio.h> #include <libxml/parser.h> struct Person { char name[50]; int age; char address[100]; }; void parseXml(const char* xmlFile, struct Person* person) { xmlDocPtr doc; xmlNodePtr rootNode, node; // 打开 XML 文件 doc = xmlReadFile(xmlFile, NULL, 0); if (doc == NULL) { printf("无法打开 XML 文件\n"); return; } // 获取根节点 rootNode = xmlDocGetRootElement(doc); if (rootNode == NULL) { printf("XML 文件为空\n"); xmlFreeDoc(doc); return; } // 遍历子节点 for (node = rootNode->children; node != NULL; node = node->next) { if (node->type == XML_ELEMENT_NODE) { xmlChar* content = xmlNodeGetContent(node); if (xmlStrcmp(node->name, (const xmlChar*)"name") == 0) { snprintf(person->name, sizeof(person->name), "%s", content); } else if (xmlStrcmp(node->name, (const xmlChar*)"age") == 0) { person->age = atoi((const char*)content); } else if (xmlStrcmp(node->name, (const xmlChar*)"address") == 0) { snprintf(person->address, sizeof(person->address), "%s", content); } xmlFree(content); } } // 释放资源 xmlFreeDoc(doc); xmlCleanupParser(); } int main() { struct Person person; parseXml("person.xml", &person); printf("Name: %s\n", person.name); printf("Age: %d\n", person.age); printf("Address: %s\n", person.address); return 0; } ``` 在上面的示例中,我们定义了一个名为 `Person` 的结构体,用于存储从 XML 文件中解析出的数据。`parseXml` 函数使用 libxml2 库来解析 XML 文件,并将解析结果保存到 `Person` 结构体中。 你需要根据你的 XML 文件的实际结构和字段名称来修改代码中的相关部分。 请注意,在使用 libxml2 库之前,你需要先安装它并在编译时链接该库。具体的安装和链接步骤根据你使用的操作系统和编译环境而定。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值