Bernhard: Validierung gegen ein XML Schema

Hi!

Ich habe eine Grundsatzfrage zum Konzept der Schema-Validierung:

Wenn ich gegen eine DTD validieren will, dann schaut ein validierender Parser die DOCTYPE-Angabe an, holt sich die DTD vom angegeben Pfad und validiert gegen eben diese.

<?xml version="1.0"?>  
<!DOCTYPE EMail SYSTEM "../src/my.dtd">  
<Root>  
<!-- Dokumentinhalt -->  
</Root>

Will ich gegen ein Schema validieren, schaut eine Beispielinstanz z.B. ungefähr so aus:

<?xml version="1.0"?>  
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../src/my.xsd">  
<!-- Dokumentinhalt -->  
</Root>

Der Pfad zum Schema wird also in einem Attribut angegeben. Schreibe ich eine Applikation, die diese Instanz gegen das angegeben Schema validieren will, so kann ich das angegeben Schema nicht aus dieser Instanz herauslesen, denn dass das Attribut überhaupt vorhanden ist, ist ja erst _nach_ der Validierung sichergestellt.

Das gefällt mir nicht. Ich möchte den Pfad zum Schema nicht irgendwo extern angeben, sondern aus der Instanz herauslesen. Es scheint mir aber, als wäre das grundsätzlich nicht möglich. (Ich sehe keine Möglichkeit, das Vorhandensein des Attributs _vor_ der Validierung sicherzustellen.) Ist das wirklich so?

Falls das so ist: In meiner konkreten Anwendung könnte ich mir als "Lösung" eine doppelte Validierung vorstellen. Das Gerüst meiner Instanzen wird von einem Menschen erstellt, der einen validierenden Editor verwenden kann, und so sicherstellt, dass "noNamespaceSchemaLocation" angegeben wurde. Die Applikation könnte sich dann darauf verlassen.

Allerdings habe ich es nicht geschafft, mein Schema so zu schreiben, dass es dieses Attribut im Wurzelelement deklariert. Ich glaube, da hakt es irgendwie mit den Namensräumen oder Präfixen. (Das Konzept hab ich nicht hundertprozentig durchdrungen.) Kann mir jemand erklären, wie ich mein Schema gestalten muss, damit diese beiden Attribute (genau in dieser Form) beim Wurzelelement angegeben sein müssen:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="{Pfad}"

Danke und Gruß
Bernhard

  1. Hi Bernhard,

    Will ich gegen ein Schema validieren, schaut eine Beispielinstanz z.B. ungefähr so aus:

    <?xml version="1.0"?>

    <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../src/my.xsd">
    <!-- Dokumentinhalt -->
    </Root>

    
    > Der Pfad zum Schema wird also in einem Attribut angegeben. Schreibe ich eine Applikation, die diese Instanz gegen das angegeben Schema validieren will, so kann ich das angegeben Schema nicht aus dieser Instanz herauslesen, denn dass das Attribut überhaupt vorhanden ist, ist ja erst \_nach\_ der Validierung sichergestellt.  
    
    Du validierst ohne Schemaangabe, dann kriegst du entweder die Rückmeldung, dass nicht validiert werden kann, weil der Eintrag fehlt oder die Validierung startet gegen das angegebene Schema.  
      
    ciao  
    romy
    
    -- 
    [Sie möchten einem Tier ein neues zu Hause geben?](http://www.findeltiere.de/index.php?navi=abzugeben)  
      
    ![](http://www.romy-b.de/Zeug/gans.jpg)
    
    1. Hi!

      Der Pfad zum Schema wird also in einem Attribut angegeben. Schreibe ich eine Applikation, die diese Instanz gegen das angegeben Schema validieren will, so kann ich das angegeben Schema nicht aus dieser Instanz herauslesen, denn dass das Attribut überhaupt vorhanden ist, ist ja erst _nach_ der Validierung sichergestellt.
      Du validierst ohne Schemaangabe, dann kriegst du entweder die Rückmeldung, dass nicht validiert werden kann, weil der Eintrag fehlt oder die Validierung startet gegen das angegebene Schema.

      Die LINQ to XML API bietet diese Möglichkeit nicht an (oder ich habe was übersehen). Wenn ich für das Schema null angebe, dann knallt's jedenfalls (ArgumentNullException).

      Ich kann natürlich im Code "manuell" prüfen, ob das Attribut vorhanden ist (so mache ich es momentan auch):

        
      XAttribute schemaLocation = myDoc.Root.Attribute(xsiNs + "noNamespaceSchemaLocation");  
      if (schemaLocation != null)  
      {  
        //Validiere  
      }  
      else  
      {  
        //Fehlermeldung  
      }
      

      Das "funktioniert" natürlich, ist aber nicht sonderlich elegant...

      Grundsätzlich verstehe ich nicht, wie man sich das bei der Definition von XML Schema gedacht hat. Offensichtlich ist es nicht erwünscht, dass das Schema aus der Instanz ausgelesen werden soll. Sonst hätte man dafür doch eine elegantere Möglichkeit als das da oben dafür angeboten.

      Gruß
      Bernhard