2009-08-16 7 views
2

J'ai un problème avec les types dans mon schéma lorsque j'essaie d'utiliser xsd: any element Pendant la validation, j'ai une exception de validation: L'élément 'MerchantAccount' n'est pas déclaré.Schéma avec xsd: any - Erreur de validation XmlReader

L'idée est d'avoir la possibilité de spécifier des propriétés et des valeurs dans l'élément ExtendedProperties. S'il vous plaît aviser ce que je fais mal.

partie du schéma

... 
<xsd:complexType name="ExtendedPropertiesType"> 
    <xsd:sequence> 
     <xsd:any minOccurs="0" maxOccurs="unbounded" /> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="ProcessorInstanceType"> 
    <xsd:all> 
    <xsd:element name="Id" type="xsd:string" /> 
    <xsd:element name="Descriptor" type="xsd:string" /> 
    <xsd:element minOccurs="0" name="ExtendedProperties" type="ExtendedPropertiesType" /> 
    </xsd:all> 
    <xsd:attribute name="name" type="xsd:string" /> 
</xsd:complexType> 
... 

Une partie du fichier xml:

... 
<ProcessorInstance name="aaaa"> 
    <Id>37fc527b-2845-43d0-99ca-ac1ff6f0ed86</Id> 
    <Descriptor>Test</Descriptor> 

    <ExtendedProperties> 
    <MerchantAccount>1111</MerchantAccount> 
    </ExtendedProperties> 
</ProcessorInstance> 
... 

Code de validation:

private static XmlDocument loadConfigurationXml(FileInfo configFile) 
    { 
     //load schema 
     var sr = new StringReader(Schemas.ConfigurationSchema); 
     var schema = XmlSchema.Read(sr, (o, ea) => { throw ea.Exception; }); 
     //validate against the schema 
     var schemas = new XmlSchemaSet(); 
     schemas.Add(schema); 
     var readerSettings = new XmlReaderSettings 
     { 
      ValidationType = ValidationType.Schema, 
      ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings, 
      Schemas = schemas, 
     }; 
     readerSettings.ValidationEventHandler += (o, ea)=> 
     { 
      throw new PaynetValidationException(
       string.Format("Invalid configuration file, see schema for details: {0}", 
           ea.Message), 
       ea.Exception); 
     }; 
     var reader = XmlReader.Create(configFile.FullName, readerSettings); 
     //parse and validate config file 
     while (reader.Read()){} 

     var ret = new XmlDocument(); 
     if (configFile.Length != 0) 
      ret.Load(configFile.FullName); 

     return ret; 
    } 

Répondre

4

En effet, le défaut de l'attribut processContents est strict. Si vous voulez que pour valider lorsque vous ne disposez pas du schéma pour les éléments, utilisez

<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/> 

BTW, si vous la conception de ce schéma, je vous suggère de rester loin de xs:all. Cela peut sembler une bonne idée d'autoriser la saisie d'éléments dans n'importe quel ordre, mais cela peut conduire à des modèles de contenu ambigus et peut conduire le code à traiter le schéma de manière absolument absurde.

+0

Merci pour votre réponse! J'ai changé la définition à la façon dont vous avez dit mais maintenant j'ai un message d'erreur: 'Impossible de trouver les informations de schéma pour l'élément' MerchantAccount '' – IlliakaillI

+0

Mais! avec processContents = "skip" fonctionne parfaitement, merci de pointer la raison de l'erreur, problème résolu! – IlliakaillI

+0

L'élément "Impossible de trouver les informations de schéma" est-il un avertissement ou une erreur? Je parie que c'est un avertissement. Vous pouvez laisser 'XmlSchemaValidationFlags.ReportValidationWarnings' si vous ne voulez pas les avertissements. Les avertissements sont toujours "impossible à trouver". –

Questions connexes