2017-03-16 16 views
0

私はこのように定義された私の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; 

もちろん、正規表現は検証されません。

答えて

0

ローカルの正規表現パターンは無視されます(つまりクラスに対してローカル)が、非ローカルパターンは正常に動作するようです。パターンの検証を強制するために、パターンのcomplexType(クラスから持ち上げ)から持ち上げなければならない。

typedef std::string ns1__xxxXXX_string "((\\-1)|[0-5])(;((\\-1)|[0-5]))*"; 

class ns1__xxxXXX 
{ public: 
    ns1__xxxXXX_string *state; 

そしてパターンに対する文字列のコンテンツをチェックするfsvalidate()コールバックを設定します。

これは迷惑な制限です。バグや機能のリクエストをhttps://sourceforge.net/p/gsoap2/bugs/に送信することをお勧めします。

+0

お返事ありがとうございます。追加情報は私の編集をご覧ください。 – VSA

+0

gsoapのバージョンを2.8.44にアップデートしました。 – VSA