Frage

Ich mag Test (wahr oder falsch), ob eine beliebige XML-Datei mit einem bestimmten Schema entspricht.

Für das, was es wert ist, ist das Schema die Word 2003 WordML Schema, das Microsoft mit einer Liste von etwa 7 *.xsd Dateien definiert.

Eine dieser Dateien enthält auch die W3C xml.xsd Datei, die durch die folgende Aussage wie:

<xsd:import id="xml" namespace="http://www.w3.org/XML/1998/namespace"
    schemaLocation="http://www.w3.org/2001/xml.xsd"></xsd:import>

Ich bin mit .NET-Code wie folgt die Validierung zu tun:

   public static void validate(string filename)
    {
       XmlReaderSettings settings = new XmlReaderSettings();
       settings.Schemas.Add(
           "http://schemas.microsoft.com/office/word/2003/wordml",
           //to get this file I downloaded "Office 2003: XML Reference Schemas", i.e. "Office2003XMLSchema.exe" 
           @"C:\Program Files\Microsoft Office 2003 Developer Resources\Microsoft Office 2003 XML Reference Schemas\WordprocessingML Schemas\wordnet.xsd"
           );
        settings.ValidationType = ValidationType.Schema;
        settings.ValidationEventHandler += new ValidationEventHandler(validationEventHandler);
        XmlReader xmlReader = XmlReader.Create(filename, settings);
        while (xmlReader.Read()) { }
   }

Mein Problem ist, dass, wenn ich diesen Code auf einer Maschine laufen, die nicht mit dem Internet verbunden ist, dann bekomme ich einen XmlSchemaValidationException Fehler auf die Wirkung, dass es nicht xml.xsd finden.

Um dies zu beheben, die ich heruntergeladen habe eine Kopie von xml.xsd, und fügen Sie sie explizit die settings.Schemas.Add Methode:. Die Validierung funktioniert jetzt korrekt, wenn das Gerät nicht mit dem Internet verbunden ist

Allerdings, wenn die Maschine mit dem Internet verbunden ist, habe ich jetzt eine Fehlermeldung erhalten, dass The global attribute 'http://www.w3.org/XML/1998/namespace:lang' has already been declared. sagen.

So offenbar ich entweder Notwendigkeit, es explizit hinzufügen, oder ich weiß nicht, je nachdem, ob die Maschine still Download der Lage ist, aus dem Internet (oder sogar hat vielleicht vorher die Lage gewesen, um es zu laden, und hat es irgendwo zwischengespeichert ).

So ist es „verdammt, wenn ich tue, und verdammt, wenn ich dies nicht tun“. Muß ich es einen Weg, um zu versuchen, die Ausnahme abfangen und dann versuchen, es in die andere Richtung? Oder gibt es eine elegantere Lösung?

War es hilfreich?

Lösung

Wir können nicht den Code sehen, aber In vielen Implementierungen dies durch Umleiten der Anforderung für die XSD auf die lokale Kopie mit einem Katalog Resolver behandelt wird. Es ist eine Eigenschaft XmlReaderSettings.XmlResolver dass kann dafür verwendet werden. Siehe XMLCatalog.net für eine Implementierung Apache-Lizenz Sie verwenden können.

Ein Nebeneffekt davon ist, dass Sie alle Schemata lokal zwischengespeichert halten können. Dies ist besonders wichtig, da W3C blockiert, um ihre Website übermäßig liest und zufällig Ihren Code (oder noch schlimmer, Code Ihres Kunden) beginnen zu versagen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top