Einzelnen Beitrag anzeigen

Schokohase
(Gast)

n/a Beiträge
 
#6

AW: Mehrere EDomParseError einfangen

  Alt 13. Nov 2018, 07:25
Nun, das ist eine korrekte XML Datei
Code:
<root/>
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:
2018-11-13-08_29_13-validierung.png

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.

Geändert von Schokohase (13. Nov 2018 um 07:35 Uhr)
  Mit Zitat antworten Zitat