2009-08-16 21 views
2

xsd:any要素を使用しようとすると、スキーマの型に問題があります 検証中に検証例外が発生しました: 'MerchantAccount'要素が宣言されていません。スキーマとxsd:any - XmlReader検証エラー

考えられるのは、ExtendedProperties要素内のプロパティと値を指定できることです。 私が間違っていることをアドバイスしてください。 xmlファイルの

スキーマ

... 
<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> 
... 

のパートパート:

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

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

検証コード:

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; 
    } 

答えて

4

processContents属性のデフォルトはstrictあるためです。あなたは要素のスキーマを持っていないときには、検証したい場合は、その後、ところで

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

を使用しますが、このスキーマを設計している場合、私はあなたがxs:allから離れて滞在をお勧めしたいです。要素を任意の順序で入力できるようにするのは良い考えのように聞こえるかもしれませんが、これはあいまいなコンテンツモデルにつながり、スキーマを処理するコードを絶対に動かすことができません。

+0

お返事ありがとうございます! あなたは と言った方法で定義を変更しましたが、今はエラーメッセージが表示されます: 'MerchantAccount'要素のスキーマ情報が見つかりませんでした – IlliakaillI

+0

しかし! processContents = "skip"はエラーの理由を指摘してくれてありがとうございます。問題は解決しました! – IlliakaillI

+0

「スキーマ情報が見つかりませんでした」という警告またはエラーはありますか?私はそれが警告だと思う。警告が必要ない場合は、 'XmlSchemaValidationFlags.ReportValidationWarnings'を省略することができます。警告は常に「見つけることができません」です。 –