2009-05-08 6 views
0

J'ai une réponse XML provenant d'un autre système, mais pas de XSD, j'ai donc utilisé l'option Créer un schéma pour en générer un.XSD généré par BizTalk ne parvient pas à valider le code XML dérivé de

J'ai ensuite ajouté le fichier XSD à mon projet BizTalk 2006 R2 et j'ai défini sa propriété "Input Instance Filename" sur le message XML d'origine.

Essayé l'option « Valider instance » et il ne réussit pas ???, avec quelques erreurs comme si ...
erreur BEC2004: xsi: valeur d'attribut de type « http://www.w3.org/2001/XMLSchema:int » est pas valable pour l'élément ' http://www.aniteps.com/xml/schemas/awm/images4:NumberOfErrors ', soit parce que ce n'est pas un type dérivant valablement du type dans le schéma, soit parce qu'il a une dérivation xsi: type bloquée.

Comment diable peut échouer le XML qui a été utilisé pour générer le XSD?

L'exemple XML je ... est

<?xml version="1.0" encoding="utf-8"?> 
<ImportIndexDocumentResponse 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.aniteps.com/xml/schemas/awm/images4"> 
    <HasErrors>false</HasErrors> 
    <NumberOfErrors xsi:type="xsd:int">0</NumberOfErrors> 
    <ErrorDescription xsi:type="xsd:string">No exception ocurred.</ErrorDescription> 
    <ErrorNumber xsi:type="xsd:int">0</ErrorNumber> 
    <FailedItems> 
    <Item> 
     <OriginalDataString xsi:type="xsd:string" /> 
     <ErrorDescription xsi:type="xsd:string" /> 
    </Item> 
    </FailedItems> 
    <UniqueDocumentReferences> 
    <UniqueDocumentReference>FA40FE</UniqueDocumentReference> 
    <UniqueDocumentReference>U55922</UniqueDocumentReference> 
    </UniqueDocumentReferences> 
</ImportIndexDocumentResponse> 

et BizTalk/Visual Studio 2005 génère ...

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      attributeFormDefault="unqualified" 
      elementFormDefault="qualified" 
      targetNamespace="http://www.aniteps.com/xml/schemas/awm/images4"> 
    <xs:element name="ImportIndexDocumentResponse"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="HasErrors" type="xs:boolean" /> 
     <xs:element name="NumberOfErrors" type="xs:unsignedByte" /> 
     <xs:element name="ErrorDescription" type="xs:string" /> 
     <xs:element name="ErrorNumber" type="xs:unsignedByte" /> 
     <xs:element name="FailedItems"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Item"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="OriginalDataString" /> 
        <xs:element name="ErrorDescription" /> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="UniqueDocumentReferences"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element maxOccurs="unbounded" name="UniqueDocumentReference" type="xs:string" /> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xsd:schema> 

Répondre

4

Le générateur XSD est raisonnablement stupide, et n'a pas remarqué que l'exemple de document d'instance contenait des annotations de type (xsi: attributs de type). Il a donc décidé que <ErrorDescription> devrait contenir des octets non signés et des entiers non signés, comme le dit l'annotation de type. Qu'est-ce qui se passe alors est que le validateur devient confus parce qu'il y a deux définitions de type distinctes pour l'élément, alors qui devrait-il croire? Vous pouvez essayer de modifier le schéma afin que les définitions de type correspondent aux remplacements xsi: type, ce qui peut aider un peu.

+0

Spot sur Tomas, changé en xs: int et mon test d'unité fonctionne un régal. Un grand merci pour l'aide – SteveC