/** 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*) ¶m); \ 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