web-dev-qa-db-fra.com

à quoi sert xsi: schemaLocation?

Je vois que nous avons plusieurs URLs comme valeur de cet attribut, comme au printemps:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

Pourquoi est-il nécessaire et à quoi sert-il? Est-ce que le printemps va à l'URL et valider? Quelle est la différence entre xmlns et xsi: schemaLocation?

118
sab

L'analyseur XML XML utilisé par Spring lira les valeurs schemaLocation et tentera de les charger à partir d'Internet afin de valider le fichier XML. Spring, à son tour, intercepte ces demandes de chargement et distribue des versions à partir de ses propres fichiers JAR.

Si vous omettez la variable schemaLocation, l'analyseur XML ne saura pas où obtenir le schéma pour valider la configuration.

78
skaffman

Un xmlns est un identifiant unique dans le document - il n'est pas nécessaire que ce soit un URI pour le schéma:

Les espaces de noms XML constituent une méthode simple pour qualifier les noms d'éléments et d'attributs utilisés dans les documents Extensible Markup Language en les associant à des espaces de noms identifiés par des références URI.

xsi:schemaLocation est supposé donner un indice sur l'emplacement réel du schéma:

peut être utilisé dans un document pour fournir des indications sur l'emplacement physique des documents de schéma pouvant être utilisés pour l'évaluation.

65
Oded

Selon le spécification pour la localisation de schémas

il peut y avoir ou non un schéma récupérable via le nom de l'espace de noms ... Les accords de communauté d'utilisateurs et/ou de consommateurs/fournisseurs peuvent établir des circonstances dans lesquelles [essayer d'extraire un xsd de l'URL de l'espace de noms] est une stratégie par défaut judicieuse

(merci d'être sans ambiguïté, spec!) 

et 

dans le cas où un auteur de document (humain ou non) crée un document avec un schéma particulier en vue et garantit que tout ou partie du document est conforme à ce schéma, les attributs [schemaLocation et noNamespaceSchemaLocation sont fournis.

En résumé, si vous spécifiez simplement un espace de noms, votre XML pourrait "être" tenté d'être validé par rapport à un xsd à cet emplacement (même s'il lui manque un attribut schemaLocation), en fonction de votre "communauté". Si vous spécifiez une schemaLocation spécifique, cela implique en principe que le document xml "doit" être conforme à xsd, donc "veuillez le valider" (tel que je l'ai lu). Mon hypothèse est que si vous ne faites pas d'attribut schemaLocation ou noNamespaceSchemaLocation, il ne fait que "ne pas valider" la plupart du temps (d'après les autres réponses, Java semble le faire de cette façon).

Une autre difficulté réside dans le fait que, généralement, avec la validation xsd dans les bibliothèques Java [ex: fichiers xml de spring config], si vos fichiers XML spécifient une URL schemaLocation xsd particulière dans un fichier XML, comme xsi:schemaLocation="http://somewhere http://somewhere/something.xsd" généralement dans l’un de vos fichiers dépendants, il contient une copie de ce fichier xsd, dans sa section ressources, et spring possède une fonction de "mappage" indiquant de traiter ce fichier xsd comme s'il correspond à l'url http://somewhere/something.xsd (pour ne jamais accéder au Web et télécharger le fichier , il n’existe que localement). Voir aussi https://stackoverflow.com/a/41225329/32453 } pour un peu plus d'informations.

19
rogerdpack

Si vous vous rendez dans l'un de ces emplacements, vous trouverez ce qui est défini dans ce schéma. Par exemple, il vous indique quel est le type de données de la valeur des mots clés ini-method. 

0
Mojun Zhu