2017-02-06 13 views
1

質問があります。このXSD構文は有効ですか? gSOAPを使用すると、同じ名前(名前C)の2つの他の構造体からなるstruct(C/C++コード)が作成され、そのコードをc/C++コンパイラでコンパイルしようとすると警告が表示されるためprodeces errors(1つの構造体内に同じ名前の構造体があるため)。 XSDファイルに触れることなくこれを解決する方法はありますか?私はそれを使用して作成するのgSOAPでXSDスキームの構文とgSoap

<complexType name="A"> 
<choice> 
<sequence> 
<element name="B" type="base64Binary"/> 
<element name="C" type="base64Binary" minOccurs="0"/> 
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> 
</sequence> 
<sequence> 
<element name="C" type="base64Binary"/> 
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> 
</sequence> 
</choice> 
</complexType> 

wsdl2h.exe -oSoap.h -s -y -c a.wsdl b.wsdl ...

soapcpp2.exe -C -L -n -x -w -c -d.\source Soap.h

+0

@KeineLust、gSoapはC/C++コードを生成します。ここで、1つの構造体内の2つの構造体が同じ名前を持つという問題があります。 –

+0

ok;)これらの警告を表示できますか? –

+0

'' 'エラー: 'struct a :: c''''の再定義と ' 'エラー:struct a :: c'''''の前の定義 –

答えて

0

をはい、それが有効なXSD構文です。あなたのコードジェネレータが処理できない場合のように見えます。

+0

申し訳ありませんが、この回答は間違っています。はい、有効なXSDです。しかし、コードジェネレータはこれをフォルトしていません。それは単なる警告です。私はこのようなコードで作業しました。コード生成プログラムがこのXSDをうまく処理していることを証明できます。 –

0

soapcpp2ツールは不満がありますが、生成されたコードは設計通りに動作します。私はこれに取り組み、それをテストしました。ここで

は、私がsoapcpp2によって生成され得るものである:

class ns__A 
{ public: 
// BEGIN CHOICE <xs:choice> 
/// @note <xs:choice> with embedded <xs:sequence> or <xs:group> prevents the use of a union for <xs:choice>. Instead of being members of a union, the following members are declared optional. Only one member should be non-NULL by choice. 
// BEGIN SEQUENCE <xs:sequence> 
/// Element "B" of XSD type xs:base64Binary. 
    xsd__base64Binary*     B        nullptr; ///< Required nillable (xsi:nil when NULL) element. 
/// Element "C" of XSD type xs:base64Binary. 
    xsd__base64Binary*     C        ; ///< Required element. 
/// Size of the array of XML or DOM nodes is 0..unbounded. 
    std::vector<_XML     > __any       0; ///< Catch any element content in XML string. 
// END OF SEQUENCE 
// BEGIN SEQUENCE <xs:sequence> 
/// Element "C" of XSD type xs:base64Binary. 
    xsd__base64Binary*     C        nullptr; ///< Required nillable (xsi:nil when NULL) element. 
/// Size of the array of XML or DOM nodes is 0..unbounded. 
    std::vector<_XML     > __any       0; ///< Catch any element content in XML string. 
// END OF SEQUENCE 
// END OF CHOICE 
/// A handle to the soap struct context that manages this instance when instantiated by a context or NULL otherwise (automatically set). 
    struct soap       *soap       ; 
}; 

soapcpp2によって報告された「問題」の理由は、ストリーミングシリアライザはCの選択肢を区別することができないということです。どちらもエンコードされています。 2番目のCC_と名前が変更され、データを逆シリアル化することはありません。

簡単な説明:あなたは大丈夫です。

関連する問題