2017-02-06 1 views
1

질문이 있습니다.이 XSD 구문이 유효합니까? 왜냐하면 gSOAP을 사용할 때 같은 이름 (이름 C)을 가진 두 개의 다른 구조체로 구성된 구조체 (C/C++ 코드)가 만들어지기 때문에 경고 메시지가 나타나기 때문에 경고 메시지가 나타납니다. 그런 다음 c/C++ 컴파일러에서 해당 코드를 컴파일하려고하면 prodeces 오류 (하나의 구조체 안에 같은 이름의 구조체가 있기 때문에). XSD 파일을 건드리지 않고이 문제를 해결하는 방법은 무엇입니까?XSD 체계 구문 및 gSoap

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++ 코드를 생성합니다. 하나의 구조체 안에 두 개의 구조체가 같은 이름을 갖는 문제가 있습니다. –

+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의 선택을 구별 할 수 있다는 것입니다. 그래서 둘 다 인코딩됩니다. 두 번째 CC_으로 이름이 바뀌며 데이터를 역 직렬화하는 데 사용되지 않습니다.

간단한 설명 : 괜찮습니다.