Nun, das ist eine korrekte
XML Datei
passt aber nicht zum Schema. Selbst ohne Parser können wir erkennen, dass die Struktur formal korrekt ist und das kann der Parser auch, denn der prüft
erst die Struktur und
danach gegen das Schema.
Der Apfelprüfer prüft also erst, ob er auch wirklich einen Apfel hat, und dann ob der Apfel den geforderten Kriterien standhält.
Wenn die Struktur nicht korrekt ist, dann erübrigt sich das Prüfen gegen das Schema, aber ist die Struktur korrekt, dann könnte komplett gegen das Schema geprüft werden. Das kann die Delphi-
XML-Implementierung aber nicht.
Hier ein
XML-Editor, der
mehrere Schema-Validierungsfehler anzeigt:
Hier ein C#-Programm, das mehrere Schema-Validierungsfehler anzeigt:
Code:
static void Main(string[] args)
{
var result = ValidateXml(@".\data\Adressenliste.xml");
if (result.Any())
{
foreach (var item in result)
{
var defaultColor = Console.ForegroundColor;
switch (item.Severity)
{
case XmlSeverityType.Error:
Console.ForegroundColor = ConsoleColor.Red;
break;
case XmlSeverityType.Warning:
Console.ForegroundColor = ConsoleColor.Yellow;
break;
default:
break;
}
Console.Write("{0}: ", item.Severity);
Console.ForegroundColor = defaultColor;
Console.WriteLine(item.Message);
Console.WriteLine();
}
}
else
{
Console.WriteLine("is fine");
}
}
static IEnumerable<ValidationEventArgs> ValidateXml(string filename)
{
var result = new List<ValidationEventArgs>();
var readerSettings = new XmlReaderSettings
{
ConformanceLevel = ConformanceLevel.Document,
DtdProcessing = DtdProcessing.Parse,
ValidationType = ValidationType.Schema,
ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation
| XmlSchemaValidationFlags.ProcessInlineSchema
| XmlSchemaValidationFlags.ReportValidationWarnings
| XmlSchemaValidationFlags.ProcessIdentityConstraints,
};
readerSettings.ValidationEventHandler += (s, e) =>
{
result.Add(e);
};
using (var reader = XmlReader.Create(filename, readerSettings))
{
while (reader.Read()) { }
}
return result;
}
und die Ausgabe zu der gleichen
XML-Datei wie aus dem Editor
Code:
Error: Das Element 'Geburtsdatum' ist ungültig - Der Wert '12-12-12' ist gemäß seinem Datentyp 'http://www.w3.org/2001/XMLSchema:date' ungültig -- Die Zeichenfolge '12-12-12' kein gültiger Date-Wert..
Error: Für den Schlüssel 'uniqueAdresse' oder eine eindeutige Identitätseinschränkung ist eine doppelte Schlüsselsequenz '1' vorhanden.