Laden...

[Gelöst]XmlReader.Read()validiert elementfremdes XML-Schema

Erstellt von bigeddie vor 3 Jahren Letzter Beitrag vor 3 Jahren 758 Views
B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 3 Jahren
[Gelöst]XmlReader.Read()validiert elementfremdes XML-Schema

verwendetes Datenbanksystem: <XML>

Hallo Community,

ich habe folgendes gefunden:

Habe eine kleines Konsolen-Programm geschrieben welches mir über einen XmlReader eine XMl-Datei gegen ein XSD validieren soll. Aber die Validierung läuft auch gegen komplett andere Xml#s durch.

Hier der Code:


using System;
using System.Xml;
using System.Xml.Schema;

class XmlSchemaSetExample
{
    static void Main()
    {
        XmlReaderSettings booksSettings = new XmlReaderSettings();
        booksSettings.Schemas.Add(null, "books.xsd");
        booksSettings.Schemas.Compile();
        booksSettings.ValidationType = ValidationType.Schema;
        //booksSettings.ValidationEventHandler += new ValidationEventHandler(booksSettingsValidationEventHandler);

        XmlReader books = XmlReader.Create("Adressen.xml", booksSettings);
        //XmlReader books = XmlReader.Create("Books.xml", booksSettings);
        int i=1;
        try
        {
            while (books.Read())
            {
                Console.WriteLine($"Zeile gelesen {i}");
                Console.WriteLine(books.Name);
                Console.WriteLine(books.Value);
                i++;
            }
        }
        catch (Exception e)
        {
            Console.Write(e.ToString());
        }

        
    }

    static void booksSettingsValidationEventHandler(object sender, ValidationEventArgs e)
    {
        if (e.Severity == XmlSeverityType.Warning)
        {
            Console.Write("WARNING: ");
            Console.WriteLine(e.Message);
        }
        else if (e.Severity == XmlSeverityType.Error)
        {
            Console.Write("ERROR: ");
            Console.WriteLine(e.Message);
        }
    }
}

Das Schema:


<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="bookstore">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="book">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="title" type="xs:string" />
                            <xs:element name="author">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element minOccurs="1" name="name" type="xs:string" />
                                        <xs:element minOccurs="0" name="first-name" type="xs:string" />
                                        <xs:element minOccurs="0" name="last-name" type="xs:string" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="price" type="xs:decimal" />
                        </xs:sequence>
                        <xs:attribute name="genre" type="xs:string" use="required" />
                        <xs:attribute name="publicationdate" type="xs:date" use="required" />
                        <xs:attribute name="ISBN" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

und zwei Xml's

<bookstore xmlns="http://www.contoso.com/books">
    <book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
        <title>The Autobiography of Benjamin Franklin</title>
        <author>
            <first-name>Benjamin</first-name>
            <last-name>Franklin</last-name>
        </author>
        <price>8.99</price>
    </book>
    <book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
        <title>The Confidence Man</title>
        <author>
            <first-name>Herman</first-name>
            <last-name>Melville</last-name>
        </author>
        <price>11.99</price>
    </book>
    <book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
        <title>The Gorgias</title>
        <author>
            <name>Plato</name>
        </author>
        <price>9.99</price>
    </book>
</bookstore>

validiert nicht, da der Knoten "Name" fehlt.


<?xml version="1.0" encoding="utf-8"?>
<Adressen>
    <Adresse>
        <Name>Müller, Lieschen</Name>
        <Strasse>Musterstr.</Strasse>
        <Hausnummer>4</Hausnummer>
        <Plz>0815</Plz>
        <Ort>Musterdorf</Ort>
    </Adresse>
</Adressen>

Validiert, obwohl dieses XML nichts mit der Strüktur aus der XSD gemein hat.

Viele Grüße

Bigeddie

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉

656 Beiträge seit 2008
vor 3 Jahren

Das ist aber Zufall, dass es mit der ersten XML trotzdem funktioniert. Weil eigentlich ist der erste Parameter von [XmlSchemaCollection.Add(string, string)](https://docs.microsoft.com/en-us/dotnet/api/system.xml.schema.xmlschemacollection.add?view=netcore-3.1#System_Xml_Schema_XmlSchemaCollection_Add_System_String_System_String_) der Target Namespace zu dem das Schema gehört - und dein Book XML hat eindeutig einen (Default-)Namespace.

B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 3 Jahren

Hallo Bhaal,

dann füge mal den Namespace als erstes Argument hinzu und lass es laufen.
Weiterhin habe ich auch mal den Namespace im Root-Element entfernt (Books.xml) und siehe da, es läuft ohne Fehler, obwohl kein "Name" knoten existiert, welcher ja lauf XSD mindestens einmal vorhanden sein muss.

Viele Grüße

Bigeddie

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉

656 Beiträge seit 2008
vor 3 Jahren

Setzt du auch irgendwo booksSettings.ValidationFlags? Eventuell musst du dort XmlSchemaValidationFlags.ReportValidationWarnings mit reingeben, damit nicht bekannte Namespaces auch rauskommen (was nur Warnings sind, keine Errors - weil der Inhalt ja tatsächlich gültig sein könnte; dein Reader es aber mit den angegebenen Informationen nicht feststellen kann).

B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 3 Jahren

Hallo Bhaal,
Validationflags hatte ich garnicht auf dem Schirm, da alle Samples die ich gefunden habe(auch auf der Hersteller-Seite), diese auch nicht verwenden.

Jetzt läuft es auch mit dem Reader.

DANKE und viele Grüße

Bigeddie

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉