Walidacja dokumentów a flaga ReportValidationWarnings

Uruchamiamy program - walidacja nie zwraca żadnych błędów. Ale zaraz, zaraz... "O ja głupia {skreślone}!!!" -  okazało się, że niechcący oryginalny plik "slownik.xml" nadpisałem innym dokumentem i tak naprawdę zawartość wygląda tak:

<root />

No to teraz chyba coś już tu na serio nie gra... Powinny być jakieś elementy "slownik" czy "element" w źródłowym dokumencie a tu ani elementów nie ma ani żadnych błędów walidacji. "Chłopaki (i dziewczyny) się nie ucieszą jak coś takiego dostaną ale, kurcze, walidacja nie zwraca błędów czyli chyba jest OK, no nie? A może troche pogooglować... O! - są jakieś ustawienia dotyczące walidacji. Zobaczmy na co to się może przydać".
Po dodaniu jednej linijki kod do walidacji wygląda następująco:

public void ValidateXml() {

   XmlReaderSettings readerSettings =
new XmlReaderSettings();

   readerSettings.ValidationType = ValidationType.Schema;

// niech procesor schemy zwraca również ostrzeżenia
    readerSettings.ValidationFlags =
XmlSchemaValidationFlags.ReportValidationWarnings;

   readerSettings.Schemas.Add("http://xml.com.pl/slownik",
"C:\\temp\\test.xsd");
   readerSettings.ValidationEventHandler +=
new ValidationEventHandler(ValidationCallBack);

   using(XmlReader xr =
XmlReader.Create("D:\\temp\\test.xml",
readerSettings)) {
      while(xr.Read()) { }
   }
}



private static void ValidationCallBack(object sender,
ValidationEventArgs args) {

Console.WriteLine(args.Severity + ": " + args.Message);
}

Wypróbujmy go na niesławnym <root /> z pliku "slownik.xml" - "Kurza twarz, oprócz tego, że mi sie Chrome zawiesił to jeszcze sie pojawił taki komunikat:

Warning: Could not find schema information for the element 
'root'.

".Jest to na pewno poprawa - przynajmniej widać, że procesor XSD 'jakoś' działa. Żeby zrozumieć co ten komunikat błędu tak naprawde oznacza trzeba się jeszcze raz dokładnie przyjrzeć schemie. Otóż, według schemy, element "slownik" (i jego potomkowie) pochodzi z przestrzeni nazw "http://xml.com.pl/slownik". W dokumencie podanym do walidacji główny węzeł nie należy jednak do tej przestrzeni nazw, a schemaSet użyty do walidacji nie zawiera żadnej schemy, która odpowiadałaby za walidacje elementów z przestrzeni nazw z której pochodzi element "root" (xmlns=""). Czyli ponieważ nie istnieje odpowiednia schema dokument nie jest walidowany! ("No, teraz to już naprawde 'kurza twarz'!"). Wobec tego, pierwotny dokument (który "ja głupia {skreślone} nadpisałem") też nigdy nie był walidowany bo nie byl w odpowieniej przestrzeni nazw! Po dodaniu odpowiedniej definicji (xmlns="http://xml.com.pl/slownik" w elemencie "slownik") z pewną dozą nieśmiałości pojawiają się następujące komunikaty błędów:

Error: The 'wratosc' attribute is not declared.
Error: The required attribute 'wartosc' is missing.

Czyli jednak dokument który wydawał się bezbłędny nie dość, że nie byl w ogole walidowany to dodatkowo zawierał literówki (oczywiście ten przypadek był dość trywialny ale w dokumentach o wielkości kilkunastu czy kilkudziesięciu megabajtów zauważenie tego typu błędu jest bardzo trudne).

"Kurza twarz!"