2016-01-07 2 views
6

Я создаю веб-службу в .NET, которая будет передавать данные взад и вперёд через XML. Я хотел бы проверить XML во входящих запросах с помощью XSD, который я определил.Ошибка проверки XML: элемент не объявлен

Вот XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="POSearch"> 
     <xs:sequence minOccurs="0" maxOccurs="10"> 
      <xs:element name="POID" type="xs:positiveInteger"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

Вот это XML:

<POSearch> 
    <POID>1</POID> 
    <POID>2</POID> 
</POSearch> 

Вот код проверки в C#:

static void Main(string[] args){ 
    XmlSchemaSet iSchemas = new XmlSchemaSet(); 
    iSchemas.Add(string.Empty, @"...xsd file location"); 

    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.ValidationType = ValidationType.Schema; 
    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; 
    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; 
    settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; 
    settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack); 
    settings.Schemas.Add(iSchemas); 

    XmlReader reader = XmlReader.Create(@"...xml file location", settings); 

    try { 
     while(reader.Read()) 
     ; 
    } 
    catch(Exception ex) { 
     Console.WriteLine(ex.Message); 
    } 
} 

private static void ValidationCallBack(object sender, ValidationEventArgs args) { 
    if(args.Severity == XmlSeverityType.Warning) 
     Console.WriteLine("\tWarning: Matching schema not found. No validation occurred." + args.Message); 
    else 
     Console.WriteLine("\tValidation error: " + args.Message); 
    } 

Я чувствую, что я имел эту работу раньше, и я не совсем уверен, почему это сейчас не работает. Всякий раз, когда я запускаю это, я получаю следующее сообщение об исключении:

Validation error: The 'POSearch' element is not declared.

Я неправильно определил свой XSD? Является ли мой код проверки неправильным? Элементы все ясно там. Любая помощь, указывающая мне в правильном направлении, очень ценится.

ответ

6

У вас есть объявленный тип, но не объявлен ни один элемент этого типа.

Добавить объявление элемента:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="POSearch" type="POSearch"/> 

    <xs:complexType name="POSearch"> 
     <xs:sequence minOccurs="0" maxOccurs="10"> 
      <xs:element name="POID" type="xs:positiveInteger"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 
+0

Спасибо. Я вытягивал свои волосы из-за этого. Я новичок в XSD – mac

4

Попробуйте это:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="POSearch"> 
     <xs:sequence minOccurs="0" maxOccurs="10"> 
      <xs:element name="POID" type="xs:positiveInteger"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="POSearch" type="POSearch"/> 
</xs:schema> 
Смежные вопросы