【发布时间】:2013-11-03 01:11:54
【问题描述】:
我对使用 gSOAP 解析 XML 有一些疑问。 如果有人有这方面的经验,请给我一些帮助。谢谢:D
我以前从不了解 XML,现在我需要将 XML 解析为 C 中的结构。然后我找到了一些使用 gSOAP 数据绑定的建议。是的!它可以帮助我生成一个包含来自 XSD(XML 模式)的结构的头文件。但是现在,我也不知道如何处理 struct 或 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 by
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 发生变化,我也不必更改代码。
【问题讨论】:
标签: c xml parsing struct gsoap