# XML-Datei nach XML-Schema validieren



## Tikonteroga (7. September 2011)

Hallo,

ich muss XML-Dateien eines bestimmten Dialekts (ARXML) mit .NET verarbeiten.


```
arxmlDocument.XmlResolver = new XmlUrlResolver();
                    
arxmlDocument.Load(fileName);
                    
ValidationHandler handler = new ValidationHandler();
                    
ValidationEventHandler eventHandler = new ValidationEventHandler(handler.ValidationEventHandler);
                    
arxmlDocument.Validate(eventHandler);
```

In den XML-Dateien ist auch stets ein XML-Schema angegeben. Wenn ich jedoch die Validate Methdoe ausführe wird eine Exception mit folgender Message geworfen.



> Das XmlSchemaSet für das Dokument ist entweder Null oder enthält keine Schemas. Stellen Sie vor dem Aufruf von 'Validate' Schemainformationen bereit.



Ich hatte angenommen, dass das XML-Schema von der in der XML-Datei angegebenen Url verwendet wird und habe deswegen den XmlUrlResolver verwendet. Ist das so überhaupt möglich, oder muss ich das XML-Schema lokal einlesen ?


----------



## Tikonteroga (23. Januar 2012)

Hallo,

ich versuche zurzeit eine XML-Datei nach einem Schema zu validieren.

Hierfür verwende ich folgenden Code.


```
namespace ArxmlCheck
{
    class Program
    {
        static void ValidationEventHandler(object sender, ValidationEventArgs e)
        {
            System.Console.Error.WriteLine("[{0}/{1}] {2}", 
                e.Exception.LineNumber,                                         //Zeile 
                e.Exception.LinePosition,                                       //Spalte
                e.Exception.Message);                                           //Beschreibung
        }
        
        static void Main(string[] args)
        {
            XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();

            xmlReaderSettings.ValidationType = ValidationType.Schema;
            xmlReaderSettings.Schemas.Add("http://autosar.org/3.1.5", args[1]);
            xmlReaderSettings.ValidationEventHandler += ValidationEventHandler;

            XmlReader xmlReader = XmlReader.Create(args[0], xmlReaderSettings);

            while (xmlReader.Read()) ;

            System.Console.WriteLine("Finished");
        }
    }
}
```

Jetzt habe ich das Problem, dass der Wert von xmlns im XML Schema und in der XML-Datei unterschiedlich sind. Bedeutet dies, dass das von mir verwendete Schema nicht das Schema für die von mir zu validierende Datei ist ?

Gibt es auch eine Möglichkeit, wie ich überprüfen kann, dass die Validierung erfolgreich durchgeführt wurde ? Denn mein ValidationEventHandler wird nicht ein Mal aufgerufen.


----------



## Tikonteroga (23. Januar 2012)

Wenn ich folgenden Code ergänze ...


```
xmlReaderSettings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings;
```

... erhalte ich folgende Warnung(en).



> Die Schemainformation für das Element 'http://autosar.org/3.1.4.XXX.2:L-2' konnten nicht gefunden werden.


----------



## deepthroat (23. Januar 2012)

Hi.





Tikonteroga hat gesagt.:


> Ich hatte angenommen, dass das XML-Schema von der in der XML-Datei angegebenen Url verwendet wird und habe deswegen den XmlUrlResolver verwendet. Ist das so überhaupt möglich, oder muss ich das XML-Schema lokal einlesen ?


Ja, das ist möglich. Dazu muß im Dokument allerdings auch wirklich vereinbart sein, wo das Schema heruntergeladen werden kann. (XMLSchema-instance -> schemaLocation).


Tikonteroga hat gesagt.:


> Wenn ich folgenden Code ergänze ...
> 
> 
> ```
> ...


Du hast eine andere Version des Schemas verwendet. Die Schemata passen nicht zusammen.


Tikonteroga hat gesagt.:


> Jetzt habe ich das Problem, dass der Wert von xmlns im XML Schema und in der XML-Datei unterschiedlich sind.


Was meinst du mit "Wert" von xmlns? Meinst du den Namensraum-Präfix oder wirklich den Wert des Attributes?


Tikonteroga hat gesagt.:


> Bedeutet dies, dass das von mir verwendete Schema nicht das Schema für die von mir zu validierende Datei ist ?


Kommt drauf an was du meinst...


Tikonteroga hat gesagt.:


> Gibt es auch eine Möglichkeit, wie ich überprüfen kann, dass die Validierung erfolgreich durchgeführt wurde ? Denn mein ValidationEventHandler wird nicht ein Mal aufgerufen.


Dann gab es auch keine Probleme.

Gruß

PS: Bitte füge die Ausgaben nicht als Zitate ein, sondern als Code. Das match sich mit dem zitieren besser.


----------



## Tikonteroga (24. Januar 2012)

Hallo,

ich habe mal jeweils die Root-Elemente des XML Schema und der XML Instanz angehängt.

XML Schema


```
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:AR="http://autosar.org/3.1.5" targetNamespace="http://autosar.org/3.1.5" elementFormDefault="qualified" attributeFormDefault="unqualified">
```

XML Instanz


```
<AUTOSAR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://autosar.org/3.1.4.XXX.2" xsi:schemaLocation="http://autosar.org/3.1.4.XXX.2 autosar.xsd" T="2010-10-15T13:41:41">
```

Bei dem XML Schema handelt es sich um eine Vorgabe bzw. einen Standard. Dieser scheint aber herstellerspezifisch erweitert bzw. eingeschränkt worden sein ...

Ich muss mir jetzt wohl ein Herstellerspezifisches XML Schema besorgen ******


----------



## Martin Honnen (24. Januar 2012)

Das Schema definiert Elemente in seinem targetNamespace http://autosar.org/3.1.5, das XML-Dokument hingegen hat Elemente im Namensraum http://autosar.org/3.1.4.XXX.2.


----------

