myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Datentechnologien » [Gelöst]XmlReader.Read()validiert elementfremdes XML-Schema
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
bigeddie bigeddie ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.07.2007
Beiträge: 369
Entwicklungsumgebung: VS2017Community
Herkunft: Mannheim


bigeddie ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-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-Code:
<?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

XML-Code:
<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-Code:
<?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

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von bigeddie am 16.09.2020 08:16.

15.09.2020 13:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
BhaaL BhaaL ist männlich
myCSharp.de-Mitglied

Dabei seit: 14.02.2008
Beiträge: 635
Entwicklungsumgebung: VS2017


BhaaL ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das ist aber Zufall, dass es mit der ersten XML trotzdem funktioniert. Weil eigentlich ist der erste Parameter von  Xm
lSchemaCollection.Add(string, string)
der Target Namespace zu dem das Schema gehört - und dein Book XML hat eindeutig einen (Default-)Namespace.
15.09.2020 13:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
bigeddie bigeddie ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.07.2007
Beiträge: 369
Entwicklungsumgebung: VS2017Community
Herkunft: Mannheim

Themenstarter Thema begonnen von bigeddie

bigeddie ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
15.09.2020 14:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
BhaaL BhaaL ist männlich
myCSharp.de-Mitglied

Dabei seit: 14.02.2008
Beiträge: 635
Entwicklungsumgebung: VS2017


BhaaL ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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).
15.09.2020 15:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
bigeddie bigeddie ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.07.2007
Beiträge: 369
Entwicklungsumgebung: VS2017Community
Herkunft: Mannheim

Themenstarter Thema begonnen von bigeddie

bigeddie ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
16.09.2020 08:14 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 26.09.2020 08:30