gSOAP的正则表达式验证

问题描述:

我在我的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/),但似乎从未调用(不触​​发断点)。 Futhermore,生成gSOAP的代码不包含正则表达式,即使工具wsdl2h产生这样的:

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 ),也不soapcpp2

其他信息:

我搜索fsvalidate在gSOAP的的生成的代码,我发现:

#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

- 编辑:

我跟着@亚历克斯的意见,以从中提取复杂类型是这样的类型:

<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; 

,当然,它不验证正则表达式。

看起来,局部正则表达式模式被忽略(即局部到类),但非本地模式工作正常。强制执行图案验证,该图案具有要从的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/提交bug /功能请求

+0

感谢您的回答,请参阅我的编辑以获取更多信息。 – VSA

+0

我将gsoap的版本更新到了2.8.44,现在它可以正常工作。 – VSA