9
votes

Comment spécifier un attribut XSD Schemalocation dans VS lorsque le fichier de schéma référencé est dans un projet / montage différent?

Modifier strud> Voir ma solution ci-dessous / edit forte>

J'ai une solution de studio visuelle avec deux projets. P>

  • Projet 1 (appelez-le référencéProject) Contient un fichier de schéma XML (référencéSchema.xsd). LI>
  • Project 2 (appeler IT MainProject) contient référencéProject comme référence. Mainproject a également un fichier de schéma (Mainschema.xsd). Li> ul>

    Mainschema.xsd contient le code suivant: p> xxx pré>

    car référencéschema.xsd n'est pas dans le même dossier (ce n'est même pas dans le même projet), Je reçois une erreur disant "référencésechema.xsd n'a pas pu être résolue." A du sens. P>

    Si je modifie les XS: Inclure l'élément à cette ... p> xxx pré>

    ... L'erreur disparaît. Cependant, remarquez que j'ai fourni un chemin relatif du schéma qui ne fonctionnera que dans em> la hiérarchie des dossiers de ma solution. C'est génial quand je vis le schéma dans l'éditeur mais pas si grand quand je compile mon projet. Si je regarde dans mon dossier "bin" après la compilation, la hiérarchie des dossiers est complètement différente (les deux fichiers XSD se retrouvent réellement dans le même dossier). P>

    J'ai essayé de me contourner "Ajouter Caractéristique existante d'élément en tant que lien ", mettez un raccourci sur le fichier référencésechema.xsd dans le même dossier que mon fichier de schéma principal, mais cela n'a pas fonctionné. Le validateur XSD n'est apparemment pas capable de prétendre que le lien est le fichier réel. P>

    Donc, mon problème est qu'il ne semble pas y avoir d'URI que je peux fournir la schéma qui sera valable dans les deux situations (dans l'explorateur de la solution et pendant l'exécution). Est-ce que quelqu'un a des suggestions? P>

    merci! P>

    Modifier strong> p>

    J'ai décidé d'aller avec ceci: p>

    public class UriReplacingXmlValidator
    {
        public virtual XDocument Validate(
            string dataFolderName,
            string baseDataFolderName,
            string xmlFileName,
            string schemaFileName,
            string baseSchemaFileName)
        {
            string rootFolderPath = Environment.CurrentDirectory + Path.DirectorySeparatorChar;
            string dataFolderPath = rootFolderPath + Path.DirectorySeparatorChar + dataFolderName;
            string baseDataFolderPath = rootFolderPath + Path.DirectorySeparatorChar + baseDataFolderName;
            string xmlPath = dataFolderPath + Path.DirectorySeparatorChar + xmlFileName;
            string schemaPath = dataFolderName + Path.DirectorySeparatorChar + schemaFileName;
            string baseSchemaPath = baseDataFolderName + Path.DirectorySeparatorChar + baseSchemaFileName;
            XDocument xmlDocument = XDocument.Load(xmlPath);
            XDocument schemaDocument = XDocument.Load(schemaPath);
            ResetBaseSchemaLocation(schemaDocument, baseSchemaPath);
            XmlValidator validator = new XmlValidator();
            bool isValid = validator.Validate(xmlDocument, schemaDocument);
            if (isValid)
                return xmlDocument;
            else
                return null;
        }
    
        protected virtual void ResetBaseSchemaLocation(XDocument schemaDocument, string baseSchemaPath)
        {
            XNamespace ns = "http://www.w3.org/2001/XMLSchema";
            XAttribute attribute = schemaDocument.Element(ns + "schema").Element(ns + "redefine").Attribute("schemaLocation");
            attribute.Value = baseSchemaPath;
        }
    


2 commentaires

Que se passe-t-il lorsque vous compilez le projet avec l'emplacement pointant sur le mauvais endroit? Vous générez du code de ce schéma?


Salut John, vois mon édition ci-dessus. Merci.


3 Réponses :


0
votes

Utiliser une URL publique ou une part de réseau commun mettez les deux fichiers à cet endroit.


0 commentaires

12
votes

XSD prend uniquement en charge les emplacements URI, pas l'emplacement de chemin. Cela signifie que fichier: /// c: /path/to/vs/projects/referenceProject/data/referendedschema.xsd est valide, mais pas ../../ référencéeProject / données référencées /ReferenceDschema.xsd.


2 commentaires

@afroxav, merci de clarifier cela pour moi. Je suis proposé une solution qui fonctionne à peu près au problème (voir mon édition ci-dessus).


Il n'y a rien de tort intrinsèquement avec ../../ chemin / to / fichier.xsd . Ce serait une URI relative et est autorisée par la spécification XSD et bien comprise correctement par .NET. Bien sûr, l'emplacement doit exister et vous devez avoir les droits d'accès appropriés. L'URI sera résolu contre l'URI de base, qui est l'URI du document du document contenant, ou tout ce qui se situe dans l'attribut xml: base .



1
votes

Disclaimer: Je ne connais pas beaucoup de schéma XML. Quoi qu'il en soit, j'ai couru dans le même problème que vous.

Utiliser XS: Import plutôt que XS: Inclure semblait résoudre mon problème dans VS Designer. P>

premier schéma: p>

<xs:schema id="schema2"
    targetNamespace="http://tempuri.org/schema2.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/schema2.xsd"
    xmlns:mstns="http://tempuri.org/schema2.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:schema1="http://tempuri.org/schema1.xsd"
>
  <xs:import namespace="http://tempuri.org/schema1.xsd"/>

  <xs:element name="MySecondType" nillable="true"/>
  <xs:complexType name=MySecondType>
    <xs:element name="Value" type="schema1:MyType/>
  </xs:complexType>
</xs:schema>


1 commentaires

Bien que cela puisse résoudre un certain problème, la sémantique de l'importation ou comprenant un schéma est différente. Avec l'importation, la priorité des importations entrait en vigueur, notamment, elle agit comme si les déclarations étaient copiées et collées en place.