我有两个xsd文件“hardware.xsd”和“GPU.xsd”,它们都有不同的目标命名空间,并且都是elementFormDefault限定的。
xmlns:hardware =“urn:hardware”和xmlns:gpu =“urn:gpu”。
hardware.xsd
<xsd:complexType name="ComputerSettings">
<xsd:sequence>
<xsd:group ref="gpu:myGPU"/>
...
</xsd:sequence>
</xsd:complexType>
GPU.xsd
<xsd:group name="myGPU">
<xsd:sequence>
<xsd:element name="Frequence" type="xsd:string"/>
<xsd:element name="DedicatedMemory" type="xsd:string"/>
</xsd:sequence>
<xsd:group/>
使用这两个文件,gsoap架构导入器生成一个ComputerSettings类,其属性为Frequence和DedicatedMemory,但是他没有使用gpu前缀作为前缀。因此,当我发送请求时,最后会出现硬件前缀,并且我得到名称空间不匹配。
当我删除组并且只声明两个元素Frequence和DedicatedMemory时,在其他文件中我逐个引用了这两个元素,它完美地运行。名称空间前缀显示在头文件中。
在这种情况下,我可以替换组引用,但我有一个案例,在同一目标命名空间中有多个具有相同名称的元素。所以该小组在这里创建了一种子命名空间。所以我能够引用正确的元素。
gsoap工具有问题,还是有解决方案?
感谢您的帮助。
更新
header.h (使用群组参考)
class hardware__ComputerSettings{
public:
// BEGIN GROUP <xs:group name="myGPU">
/// Element "Frequence" of XSD type xs:string.
std::string Frequence 1; ///< Required element.
/// Element "DedicatedMemory" of XSD type xs:string.
std::string DedicatedMemory 1; ///< Required element.
// END OF GROUP
/// A handle to the soap struct that manages this instance (automatically set).
struct soap *soap ;
};
此处仅使用元素引用导入:
hardware.xsd
<xsd:complexType name="ComputerSettings">
<xsd:sequence>
<xsd:element name="Frequence" type="xsd:string"/>
<xsd:element name="DedicatedMemory" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
GPU.xsd
<xsd:element name="Frequence" type="xsd:string"/>
<xsd:element name="DedicatedMemory" type="xsd:string"/>
header.h (注意变量名前的gpu命名空间)
class hardware__ComputerSettings
{ public:
/// Element reference "urn:hardware:""urn:gpu":Frequence.
std::string gpu__Frequence 1; ///< Required element.
/// Element reference "urn:hardware:""urn:gpu":DedicatedMemory.
std::string gpu__DedicatedMemory 1; ///< Required element.
/// A handle to the soap struct that manages this instance (automatically set).
struct soap *soap ;
};
答案 0 :(得分:0)
文档有section that explains how to use gSoap with multiple namespaces。您还可以customize and optimize the type bindings by specifying prefixes you prefer。
在发行版中,您可以使用一些示例来查看它是如何完成的,引用:
这两种方法都通过gSOAP发行版中的示例,样本/链接(仅限C)和样本/链接++(带有C ++名称空间的C ++)示例进行了演示。