gsoap:引用组

时间:2015-09-21 15:20:57

标签: c++ xsd xml-namespaces gsoap

我有两个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                          ;
};

1 个答案:

答案 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 ++)示例进行了演示。