2010-06-07 23 views
6

J'utilise BizTalk 2006 R2 pour générer une référence Web à partir d'un fichier WSDL. En comparant la XSD générée au WSDL, il est évident que beaucoup d'informations ont été perdues.BizTalk Web Reference - généré XSD a «perdu» des informations de WSDL

Tenir compte de l'extrait suivant du WSDL:

<s:element form="unqualified" minOccurs="0" maxOccurs="4" name="Applicant"> 
    <s:complexType> 
    <s:sequence> 
     <s:element form="unqualified" minOccurs="1" maxOccurs="1" name="ApplicantIdentifier"> 
     <s:simpleType> 
      <s:restriction base="s:string" /> 
     </s:simpleType> 
     </s:element> 
     <s:element form="unqualified" minOccurs="0" maxOccurs="1" name="Name"> 
     <s:complexType> 
      <s:sequence> 
      <s:element form="unqualified" minOccurs="0" maxOccurs="1" name="Title"> 
       <s:simpleType> 
       <s:restriction base="s:string"> 
        <s:maxLength value="10" /> 
       </s:restriction> 
       </s:simpleType> 
      </s:element> 
      <s:element form="unqualified" minOccurs="0" maxOccurs="1" name="Forename"> 
       <s:simpleType> 
       <s:restriction base="s:string"> 
        <s:pattern value="[0-9A-Za-z \-]*" /> 
        <s:maxLength value="15" /> 
        <s:minLength value="1" /> 
       </s:restriction> 
       </s:simpleType> 
      </s:element> 
      <!-- more --> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
    </s:sequence> 
    </s:complexType> 
</s:element> 

Le XSD équivalent BizTalk a généré est:

<xs:element minOccurs="0" maxOccurs="unbounded" form="unqualified" name="Applicant"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="ApplicantIdentifier" type="xs:string" /> 
     <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="Name"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="Title" type="xs:string" /> 
      <xs:element minOccurs="0" maxOccurs="1" form="unqualified" name="Forename" type="xs:string" /> 
      <!-- more --> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Ainsi, le XSD a perdu les motifs de restriction et a fixé ses propres valeurs pour minOccurs et maxOccurs.

J'ai besoin de mapper d'une autre source au XSD et je souhaite piéger des données qui ne sont pas conformes au WSDL à ce stade.

Est-ce que quelqu'un sait pourquoi BizTalk n'a pas conservé les restrictions dans le XSD; ou comment je peux générer XSD non-lossy?

+0

L'utilisation de Xsd.exe produit-elle les mêmes résultats? – TEEKAY

+0

Merci pour la suggestion, TEEKAY. Lorsque j'ai pointé xsd.exe sur le fichier WSDL: xsd.exe "C: \ Demos \ MyProblem.wsdl"/o: "C: \ Demos" J'ai l'erreur "Erreur: argument de ligne de commande non valide: ' C: \ Demos \ MyProblem.wsdl '" Puis j'ai changé l'extension de fichier pour essayer de tromper xsd.exe: xsd.exe" C: \ Demos \ MyProblem.xsd "/ o:" C: \ Demos " Et j'ai l'erreur: "Erreur: Peut seulement générer une des classes ou ensembles de données." Merci pour la suggestion quand même. –

Répondre

1

À moins que vous faites la validation du schéma dans un pipeline BizTalk, les restrictions et maxOccurs> 1 ne vont pas réellement faire quoi que ce soit - ils ne sont pas utilisé par BizTalk à l'exécution. Je suppose que c'est la raison pour laquelle la référence Web est lossy.

Personnellement, je n'ai jamais aimé la fonction 'ajouter une référence Web', ou même la 'ajouter des métadonnées d'adaptateur'/WCF. Si votre wsdl change si fréquemment que copier manuellement les définitions de type dans un fichier xsd est trop de travail:

a) regardez la construction d'une application de console simple pour récupérer le wsdl, extraire le (s) type (s) et mettre à jour le xsd b) élaborez ce qui ne va pas dans votre processus de développement qui nécessite souvent des changements de contrat de service!