2017-03-16 2 views
0

I는 다음과 같이 정의 내 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을 사용하고 있습니다.

- 편집 :

나는이 같은 복합 타입의 유형 추출하는 알렉스의 충고 @ 다음 :

<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

로컬 정규 표현식 패턴은 무시됩니다 (즉, 클래스에 로컬 임). 그러나 비 로컬 패턴은 잘 작동합니다. 패턴 유효성 검사를 시행하기 위해, 패턴은 (클래스에서 해제)이 복합 타입에서 해제 할 수 있습니다

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