私はこのように定義された私のWSDLのパターン制限があります。のgSOAP正規表現の検証
<complexType name="xxxXXX">
<attribute name="state" use="optional">
<simpleType>
<restriction base="xs:string">
<pattern value="((\-1)|[0-5])(;((\-1)|[0-5]))*"/>
</restriction>
</simpleType>
</attribute>
</complexType>
をしかし、私は状態で要求を行うとき=「」のgSOAPはそれを受け入れます。私は、関数fsvalidate
(ここではhttps://www.genivia.com/doc/databinding/html/)を定義しなければならないが、呼び出されたことはない(ブレークポイントをトリガーしない)ことがわかった。
class ns1__xxxXXX
{ public:
@/// Content pattern is "((\\-1)|[0-5])(;((\\-1)|[0-5]))*".
std::string
*state 0; ///< Optional attribute.
/// A handle to the soap struct that manages this instance (automatically set).
struct soap *soap ;
};
たぶん私は世代のためにいくつかのオプションを欠けているが、私はwsdl2hにanythinkを見つけられませんでした(https://linux.die.net/man/1/wsdl2h: Futhermore、生成されたのgSOAPのコードは、このツールのwsdl2hが発生した場合でも、正規表現が含まれていません)もsoapcpp2
追加情報:
私はのgSOAPの中でfsvalidate検索コードを生成し、私が見つかりました:
#ifndef WITH_LEANER
if (pattern && soap->fsvalidate && (soap->error = soap->fsvalidate(soap, pattern, s)))
return NULL;
#endif
しかし、常にNULLパターンで呼ばれているようです。(!(t = soap_string_in(soap, 1, 0, -1, NULL)))
。
注:私はgSOAP 2.8.23を使用しています。
- EDIT:
私はこのような複合型のタイプを抽出するためのアレックスのアドバイスを@に続く:
<xs:simpleType name="stateType">
<xs:restriction base="xs:string">
<xs:pattern value="((\-1)|[0-5])(;((\-1)|[0-5]))*"/>
</xs:restriction>
</xs:simpleType>
<complexType name="xxxXXX">
<attribute name="state" type="tns:stateType" use="optional" />
</complexType>
そしてwsdl2hが良いものを生成するようだ:
/// Content pattern is "((\\-1)|[0-5])(;((\\-1)|[0-5]))*".
typedef std::string ns1__stateType "((\\-1)|[0-5])(;((\\-1)|[0-5]))*";
class ns1__xxxXXX
{ public:
/// Attribute "state" of XSD type "http://new.webservice.namespace":stateType.
@ns1__stateType* state 0;
しかし、gsoapによって生成される最終型はstd :: stringです。
class SOAP_CMAC ns1__xxxXXX
{
public:
std::string *state;
もちろん、正規表現は検証されません。
お返事ありがとうございます。追加情報は私の編集をご覧ください。 – VSA
gsoapのバージョンを2.8.44にアップデートしました。 – VSA