2009-08-16 4 views
2

У меня проблема с типами в моей схеме при попытке использовать xsd: любой элемент Во время проверки у меня есть исключение проверки: элемент «MerchantAccount» не объявлен.Схема с xsd: any - ошибка проверки XmlReader

Идея состоит в том, чтобы иметь возможность указывать любые свойства и значения в элементе ExtendedProperties. Прошу совета, что я делаю неправильно.

Часть схемы

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

Часть XML-файла:

... 
<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», если вы не хотите получать предупреждения. Предупреждения всегда «не могут найти». –

Смежные вопросы