a cosa serve xsi: schemaLocation?


131

Vedo che abbiamo più URL come valore di questo attributo come in primavera:

<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">

Perché è necessario ea cosa serve? Spring va all'URL e convalida? qual'è la differenza tra xmlns e xsi: schemaLocation?

Risposte:


87

Il parser XML Java che utilizza Spring leggerà i schemaLocationvalori e proverà a caricarli da Internet, al fine di convalidare il file XML. Spring, a sua volta, intercetta quelle richieste di caricamento e offre versioni dall'interno dei propri file JAR.

Se si omette il schemaLocation, il parser XML non saprà dove ottenere lo schema per convalidare la configurazione.


Il parser XML non cercherebbe il percorso della classe?
HDave il

1
@skaffman, Vuol dire che quando eseguo maven build di progetti basati su spring con -o (offline) flag la build fallirà nonostante il fatto che tutte le dipendenze siano disponibili nel mio repository locale?
aviad

@HDave Ma cosa sarebbe il parser XML, lo schema potrebbe avere qualsiasi nome
Krzysztof Krasoń

Tecnicamente, il parser XML tenterà innanzitutto di caricare lo schema da Internet, se non viene trovato o l'accesso a Internet non è disponibile, cercherà localmente il file * .xsd dal percorso della classe, se ancora non viene trovato, verrà omesso.
Frank Zhang,

Per ulteriori informazioni sul livello di intercettazione primavera, vedere stackoverflow.com/a/10768972/32453
rogerdpack

68

An xmlnsè un identificatore univoco all'interno del documento - non deve essere un URI per lo schema:

Gli spazi dei nomi XML forniscono un metodo semplice per qualificare i nomi degli elementi e degli attributi utilizzati nei documenti Extensible Markup Language associandoli agli spazi dei nomi identificati dai riferimenti URI.

xsi:schemaLocation dovrebbe dare un suggerimento sulla posizione effettiva dello schema:

può essere utilizzato in un documento per fornire suggerimenti sulla posizione fisica dei documenti dello schema che possono essere utilizzati per la valutazione.


22

Secondo le specifiche per l'individuazione degli schemi

potrebbe esserci o meno uno schema recuperabile tramite il nome dello spazio dei nomi ... Gli accordi tra la comunità dell'utente e / o il consumatore / fornitore possono stabilire circostanze in cui [tentare di recuperare un xsd dall'URL dello spazio dei nomi] è una strategia predefinita ragionevole

(grazie per essere inequivocabile, spec!)

e

nel caso in cui un autore di documenti (umano o meno) abbia creato un documento con un particolare schema in vista e garantisca che parte o tutto il documento sia conforme a quello schema, vengono forniti gli schemi schemaLocation e noNamespaceSchemaLocation [attributi].

Quindi fondamentalmente specificando solo uno spazio dei nomi, il tuo XML "potrebbe" essere tentato di essere convalidato contro un xsd in quella posizione (anche se manca di un schemaLocationattributo), a seconda della tua "comunità". Se specifichi uno specifico schemaLocation, allora in pratica implica che il documento XML "dovrebbe" essere conforme a detto xsd, quindi "per favore, convalidalo" (come ho letto). La mia ipotesi è che se non lo fai schemaLocationo non lo noNamespaceSchemaLocationattribuisci semplicemente "non è convalidato" il più delle volte (sulla base delle altre risposte, sembra che Java lo faccia in questo modo).

Un'altra ruga qui è che in genere, con la convalida xsd nelle librerie java [es: file xml config primavera], se i tuoi file XML specificano un particolare schemaLocationURL xsd in un file XML, come in xsi:schemaLocation="http://somewhere http://somewhere/something.xsd"genere in uno dei tuoi barattoli di dipendenza conterrà una copia di quel file xsd, nella sua sezione risorse, e spring ha una capacità di "mappatura" che dice di trattare quel file xsd come se fosse mappato all'URL http://somewhere/something.xsd(quindi non finisci mai per andare sul web e scaricare il file, esiste solo localmente). Vedi anche https://stackoverflow.com/a/41225329/32453 per maggiori informazioni.


0

Se vai in una di queste posizioni, troverai ciò che è definito in tali schemi. Ad esempio, ti dice qual è il tipo di dati del valore delle parole chiave ini-method.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.