Question

Je veux tester (vrai ou faux) si un fichier XML arbitraire correspond à un schéma donné.

Pour ce que ça vaut, le schéma est le schéma Word 2003 WordML, que Microsoft définit l'aide d'une liste d'environ 7 fichiers *.xsd.

L'un de ces fichiers comprend également le fichier W3C xml.xsd, en incluant la déclaration suivante:

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

Je suis en utilisant le code .NET comme suit pour faire la validation:

   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()) { }
   }

Mon problème est que si je lance ce code sur une machine qui n'est pas connecté à Internet, je reçois une erreur de XmlSchemaValidationException à l'effet qu'il ne peut pas trouver xml.xsd.

Pour résoudre ce problème, je téléchargé une copie de xml.xsd, et l'ajouter explicitement en utilisant la méthode settings.Schemas.Add:. La validation fonctionne désormais correctement lorsque la machine est pas connecté à Internet

Toutefois, lorsque l'appareil est connecté à Internet, je reçois maintenant une erreur en disant que The global attribute 'http://www.w3.org/XML/1998/namespace:lang' has already been declared..

Donc, apparemment je soit besoin d'ajouter explicitement, ou je ne fais pas, selon que la machine est capable de télécharger silencieusement de l'Internet (ou même peut-être a déjà été en mesure de le télécharger, et a mis en mémoire cache quelque part il ).

Alors, il est « damné si je fais et damné si je ne le fais pas ». Ai-je besoin de l'essayer d'une façon, attraper l'exception et puis essayer dans l'autre sens? Ou est-il une solution plus élégante?

Était-ce utile?

La solution

Nous ne pouvons pas voir votre code, mais Dans de nombreuses implémentations cela est géré en redirigeant la demande de .xsd à la copie locale à l'aide d'un résolveur de catalogue. Il y a une propriété XmlReaderSettings.XmlResolver peut être utilisé pour cela. Voir XMLCatalog.net pour une implémentation sous licence Apache, vous pouvez utiliser.

Un effet secondaire de ceci est que vous pouvez garder tous les schémas mis en cache localement. Cela est particulièrement important car le W3C bloque les lectures excessives sur leur site et au hasard votre code (ou pire, le code de votre client) commencera à l'échec.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top