我正在使用 gsoap 生成 XML SOAP 解析器和 WSDL 语法,并且想知道什么是推荐的方法来表达一个静态数组,它既可以快速解析又可以生成通过所有验证测试的相应 WSDL(如 Eclipse WSDL Validator或 NetBeans 验证 XML)。
如果我将此输入用于 gsoap:
struct ns__ArrayOfSomeInts { xsd__int ints[10]; };
我得到了这个生成的 WSDL(在定义/类型/模式标签内):
<complexType name="ArrayOfSomeInts">
<sequence>
<element name="ints" type="ns:Array10Ofxsd__int" minOccurs="1" maxOccurs="1" nillable="true"/>
</sequence>
</complexType>
<complexType name="Array10Ofxsd__int">
<complexContent>
<restriction base="SOAP-ENC:Array">
<attribute ref="SOAP-ENC:arrayType" WSDL:arrayType="xsd:int[]"/>
</restriction>
</complexContent>
</complexType>
通过 NetBeans "Validate XML" 运行它会出现以下错误:
- 错误:src-resolve:无法将名称“SOAP-ENC:Array”解析为(n)“类型定义”组件。
Eclipse WSDL Validator 给出了这两个错误:
- WS-I:(BP2108) Array 声明使用 - 限制或扩展 - soapenc:Array 类型,或在类型声明中使用 wsdl:arrayType 属性。
- WS-I:(BP2122) wsdl:types 元素包含不是 XML 模式定义的数据类型定义。
我可以通过更改 gsoap 代码来定义动态数组来清除这些错误:
struct ns__ArrayOfSomeInts { int __size; xsd__int *ints; };
(带有相应的 WSDL :)
<complexType name="ArrayOfSomeInts">
<sequence>
<element name="ints" type="xsd:int" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
但是现在我失去了使用静态数组的性能提升。是否有其他方法可以在保持合规性的同时保持性能?