à quoi sert xsi: schemaLocation?

131

Je vois que nous avons plusieurs URL 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 Spring accède à l'URL et valide? quelle est la différence entre xmlns et xsi: schemaLocation?

sab
la source

Réponses:

87

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

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

skaffman
la source
L'analyseur XML ne rechercherait-il pas le chemin de classe?
HDave
1
@skaffman, cela signifie-t-il que lorsque j'exécute maven build of spring-based project avec -o (offline) flag, la build échouera malgré le fait que toutes les dépendances sont disponibles dans mon référentiel local?
aviad
@HDave Mais que chercherait l'analyseur XML, le schéma pourrait avoir n'importe quel nom
Krzysztof Krasoń
Techniquement, l'analyseur XML essaiera d'abord de charger le schéma depuis Internet, s'il n'est pas trouvé ou si l'accès Internet n'est pas disponible, il recherchera le fichier * .xsd localement à partir du chemin de classe, s'il n'est toujours pas trouvé, il sera omis.
Frank Zhang
Pour plus d'informations sur la couche d'interception de ressort, voir stackoverflow.com/a/10768972/32453
rogerdpack
68

An xmlnsest un identifiant unique dans le document - il n'est pas nécessaire qu'il s'agisse d'un URI du schéma:

Les espaces de noms XML fournissent 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 censé donner un indice quant à 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 qui peuvent être utilisés pour l'évaluation.

Oded
la source
22

Selon les spécifications de localisation des schémas

il peut y avoir ou non un schéma récupérable via le nom de l'espace de noms ... La communauté d'utilisateurs et / ou les accords consommateur / fournisseur peuvent établir des circonstances dans lesquelles [essayer de récupérer un xsd à partir de l'URL de l'espace de noms] est une stratégie par défaut raisonnable

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

et

dans le cas où un auteur de document (humain ou non) a créé 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.

Donc, fondamentalement, en spécifiant juste un espace de noms, votre XML «pourrait» être tenté d'être validé par rapport à un xsd à cet emplacement (même s'il manque un schemaLocationattribut), en fonction de votre «communauté». Si vous spécifiez un spécifique schemaLocation, cela implique essentiellement que le document xml "devrait" être conforme audit xsd, donc "veuillez le valider" (tel que je l'ai lu). Je suppose que si vous ne faites pas un schemaLocationounoNamespaceSchemaLocation attribuez pas simplement "n'est pas validé" la plupart du temps (sur la base des autres réponses, il semble que java le fasse de cette façon).

Une autre difficulté ici est que, typiquement, avec la validation xsd dans les bibliothèques java [ex: spring config xml files], si vos fichiers XML spécifient une schemaLocationURL 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 jars de dépendance, il contiendra une copie de ce fichier xsd, dans sa section de ressources, et spring a une capacité de "mappage" indiquant de traiter ce fichier xsd comme s'il était mappé à l'url http://somewhere/something.xsd(donc vous ne finirez jamais par aller sur le Web et télécharger le fichier, il existe juste localement). Voir également https://stackoverflow.com/a/41225329/32453 pour un peu plus d'informations.

rogerdpack
la source
0

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

Mojun Zhu
la source