我有关于使用gSOAP解析XML的问题。
如果有人有相关经验,请给我提供一些帮助。谢谢:D
我以前不了解XML,现在需要将XML解析到C中的结构体中。然后我找到了一些建议使用gSOAP数据绑定的方法。没错!它帮助我生成了一个包含从XSD(XML模式)中的结构体的头文件。但是现在,我不知道该对结构体或XML文件做什么。我需要自动将XML数据放入结构体中(我的意思是,如果XSD更改,则代码不应该被更改)。与我的问题相关的gSOAP是否有任何我不知道的东西?还是我必须自己编写代码来放置数据?感谢您的关注和时间。
干杯!
----补充----
这是我所做的,在Linux的终端中工作: 我有一个名为try.xsd的XSD文件。
然后我使用这个XSD文件和gSOAP:
通过wsdl2h生成了try.h文件:
接着,我通过以下命令生成其他文件:ns1.nsmap, soapC.c soapH.H soapClient.c soapServer.c soapStub.h:
然后生成了.c文件,并包含了soapH.h和ns1.nsmap。同时在你的文件夹中包含stdsoap2.h和stdsoap2.c(可以在gSOAP软件包中找到)。
在soapStub.h文件中,结构体被构建:
我以前不了解XML,现在需要将XML解析到C中的结构体中。然后我找到了一些建议使用gSOAP数据绑定的方法。没错!它帮助我生成了一个包含从XSD(XML模式)中的结构体的头文件。但是现在,我不知道该对结构体或XML文件做什么。我需要自动将XML数据放入结构体中(我的意思是,如果XSD更改,则代码不应该被更改)。与我的问题相关的gSOAP是否有任何我不知道的东西?还是我必须自己编写代码来放置数据?感谢您的关注和时间。
干杯!
----补充----
这是我所做的,在Linux的终端中工作: 我有一个名为try.xsd的XSD文件。
<?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生成了try.h文件:
wsdl2h -c -a -o try.h -t typemap.dat try.xsd
接着,我通过以下命令生成其他文件: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文件中,结构体被构建:
....
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更改,我也不必更改代码。