首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gSOAP正则验证

gSOAP正则验证
EN

Stack Overflow用户
提问于 2017-03-16 12:05:30
回答 1查看 319关注 0票数 0

我的WSDL中有一个模式限制,定义如下:

代码语言:javascript
复制
<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>

但是当我使用state=进行请求时,“gSOAP”会接受它。我看到我必须定义函数fsvalidate (这里是https://www.genivia.com/doc/databinding/html/),但它似乎从未调用过(不触发断点)。此外,生成的gsoap代码不包含regex,即使工具wsdl2h生成以下内容:

代码语言:javascript
复制
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 (https://linux.die.net/man/1/wsdl2h)或soapcpp2上找到任何想法

其他信息:

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

代码语言:javascript
复制
#ifndef WITH_LEANER
  if (pattern && soap->fsvalidate && (soap->error = soap->fsvalidate(soap, pattern, s)))
    return NULL;
#endif

但是,它似乎总是以空模式调用。(!(t = soap_string_in(soap, 1, 0, -1, NULL)))

注意:我使用的是gSOAP 2.8.23

--编辑:

我按照@Alex的建议从complexType中提取类型,如下所示:

代码语言:javascript
复制
<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似乎产生了一些好的东西:

代码语言:javascript
复制
/// 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:

代码语言:javascript
复制
class SOAP_CMAC ns1__xxxXXX
{
public:
    std::string *state;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-19 14:50:26

看起来,本地正则表达式模式被忽略了(也就是类的本地模式),但是非本地模式工作得很好。要执行模式验证,必须从complexType (从类中取消)解除模式:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42833615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档