2017-02-06 10 views
1

У меня есть вопрос, является ли этот синтаксис XSD действительным? Потому что, когда я использую gSOAP, он запрещает мне предупреждения, потому что он создает struct (код C/C++), который состоит из двух других структур с тем же именем (имя C), а затем, когда я пытаюсь скомпилировать этот код в компиляторе c/C++, prodeces errors (из-за структуры с тем же именем внутри одной структуры). Есть ли какая-то возможность решить эту проблему, не касаясь файла XSD?Синтаксис схемы 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> 

в gSOAP создать его с помощью: 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''' и ' '' error: предыдущее определение' 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. Таким образом, оба кодируются. Второй C переименован в C_ и никогда не используется для десериализации данных.

Простое объяснение: все в порядке.