首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将gSOAP数据转换为C结构(也由gSOAP生成)

将gSOAP数据转换为C结构(也由gSOAP生成)
EN

Stack Overflow用户
提问于 2013-10-24 18:59:21
回答 2查看 4.3K关注 0票数 4

关于使用gSOAP解析XML,我有一些问题。如果有人对此有经验,请给我一些帮助。谢谢:D

我以前对XML一无所知,现在我需要将XML解析成C中的结构。然后我发现了一些使用gSOAP数据绑定的建议。而且是的!它帮助我从XSD (XML Schema)生成包含结构的头文件。但是现在,我也不知道如何处理结构或XML文件。我需要自动将XML数据放到结构中(我的意思是,如果XSD改变了,代码也不应该改变)。与我的问题有关的gSOAP有什么我不知道的吗?或者我必须自己编码才能放入数据?感谢您的关注和时间。

干杯!

-加法

这就是我所做的,我在Linux的终端中工作:我有一个名为try.xsd的XSD文件

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name='Root'>
        <xs:complexType>
        <xs:sequence>
            <xs:element name='Customers'>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name='Customer' type='xs:string' minOccurs='0' maxOccurs='unbounded' />
                        <xs:element name='Order' type='xs:string' minOccurs='0' maxOccurs='unbounded' />
                    </xs:sequence>
                    <xs:attribute name='customerid' use='required' type='xs:integer'/>
                </xs:complexType>
        </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

然后我对这个XSD文件使用gSOAP:

我使用wsdl2h生成了the .h文件,方法是

wsdl2h -c -a -o try.h -t typemap.dat try.xsd

然后我生成了rest文件: ns1.nsmap,soapC.c soapH.H soapClient.c soapServer.c soapStub.h

soapcpp2 -c -t -L -I "/home/celia/Documents/gsoap-2.7/gsoap/import" try.h

然后生成.c文件并包含soapH.h和ns1.nsmap。还要在您的文件夹中包含stdsoap2.h和stdsoap2.c (您可以在gSOAP包中找到它们)。

在soapStub.h文件中,构建了以下结构:

代码语言:javascript
复制
....
struct _ns1__Root_Customers
{
    int __sizeCustomer;     /* sequence of elements <Customer> */
    char **Customer;        /* optional element of type xsd:string */
    int __sizeOrder;        /* sequence of elements <Order> */
    char **Order;               /* optional element of type xsd:string */
    char *customerid;       /* required attribute of type xsd:integer */
}

struct _ns1__Root
{
    struct _ns1__Root_Customers Customers;        /* required element of type ssrf1:Akar-Customers */
}
....

所以现在,我搞不懂如何编写代码使XML数据自动转到这个结构,而不需要手动地使用"Customers->customerid =node->children>content“。因此,如果XSD发生更改,我也不必更改代码。

EN

回答 2

Stack Overflow用户

发布于 2013-10-24 20:22:50

在C中,没有序列化/反序列化对象(不像在C++或c#中),其中有填充结构类。在"read“和"memcpy”函数的帮助下,你必须自己编写代码。这就是我所做的,我有同样的问题,但现在可能有一些新的东西,我不知道。

票数 0
EN

Stack Overflow用户

发布于 2013-10-30 08:44:44

通过使用字符串流填充结构,您可以使用gSOAP在C++中执行以下操作:

代码语言:javascript
复制
struct _ns1__Root_Customers customers;
struct soap *ctx = soap_new();
istringstream in;
in.str("<in><Customer>a</Customer><Order>b</Order><customerid>123</customerid></in>");
ctx->is = in;
soap_read__ns1__Root_Customers(ctx, &customers);
soap_free(ctx); // does not dealloc 'customers' data (soap_end(ctx) before soap_free() will)

在C中,您可以使用FILE* fd来设置从ctx->recvfd = fd读取的源文件。从C字符串中读取数据有一个技巧,需要重新定义::frecv()回调,以便从该字符串中读取数据,并将内容复制到引擎从中读取的内部缓冲区。这需要更多的工作来重新定义回调。

编辑:为了回答问题的第二部分,有一种方法可以用您想要的任何名称声明结构成员,这是一个文档很少的功能:

代码语言:javascript
复制
struct _ns1__Root_Customers
{ …
  char *whateveryouwant `customerid`;

其中,成员名称后的是限定的或非限定的XML标记名(请谨慎使用)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19564060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档