J'ai une solution de studio visuelle avec deux projets. P> Mainschema.xsd contient le code suivant: p> 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> ... 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;
}
3 Réponses :
Utiliser une URL publique ou une part de réseau commun mettez les deux fichiers à cet endroit. P>
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 code> est valide, mais pas
../../ référencéeProject / données référencées /ReferenceDschema.xsd
. P>
@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 code>. 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 code>.
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>
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.
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.