Veo que tenemos múltiples url's como valor de este atributo como en spring:
<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">
¿Por qué es necesario y para qué sirve? ¿Spring va a la url y la valida? ¿Cuál es la diferencia entre xmlns y xsi:schemaLocation?
El analizador Java XML que utiliza spring leerá los valores schemaLocation
e intentará cargarlos desde Internet, con el fin de validar el archivo XML. Spring, a su vez, intercepta esas peticiones de carga y sirve versiones desde dentro de sus propios archivos JAR.
Si omite schemaLocation
, el analizador XML no sabrá de dónde obtener el esquema para validar la configuración.
Un xmlns
es un identificador único dentro del documento - no tiene por qué ser un URI al esquema:
Los espacios de nombres XML proporcionan un método sencillo para calificar los nombres de elementos y atributos utilizados en los documentos del Lenguaje Extensible de Marcado asociándolos con espacios de nombres identificados por referencias URI.
Se supone que xsi:schemaLocation
da una pista sobre la ubicación real del esquema:
puede utilizarse en un documento para proporcionar pistas sobre la ubicación física de los documentos de esquema que pueden utilizarse para la evaluación.
Según la especificación para localizar esquemas
puede o no haber un esquema recuperable a través del nombre del espacio de nombres... Los acuerdos entre la comunidad de usuarios y/o los consumidores/proveedores pueden establecer circunstancias en las que [intentar recuperar un xsd de la url del espacio de nombres] sea una estrategia por defecto razonable.
(¡gracias por no ser ambiguo, spec!)
y
en caso de que el autor de un documento (humano o no) haya creado un documento teniendo en cuenta un esquema concreto, y garantice que una parte o la totalidad del documento se ajusta a dicho esquema, se proporcionan los [atributos] schemaLocation y noNamespaceSchemaLocation.
Así que básicamente con especificar sólo un espacio de nombres, su XML "podría" ser validado contra un xsd en ese lugar (incluso si carece de un atributo schemaLocation
), dependiendo de su "comunidad." Si especifica un schemaLocation
específico, entonces básicamente está implicando que el documento xml "debería" ser conforme a dicho xsd, así que "por favor, valídelo" (como yo lo leo). Mi conjetura es que si usted don't hacer un schemaLocation
o noNamespaceSchemaLocation
atributo que simplemente "no es validated', la mayoría de las veces (basado en las otras respuestas, parece java lo hace de esta manera).
Otro problema es que, normalmente, con la validación xsd en las bibliotecas java [por ejemplo: spring config xml files], si sus archivos XML especifica un particular schemaLocation
xsd url en un archivo XML, como xsi:schemaLocation="http://somewhere http://somewhere/something.xsd"
típicamente dentro de uno de tus jars de dependencia contenga una copia de ese fichero xsd, en su sección de recursos, y spring tiene una capacidad de "mapeo" diciendo que trate ese fichero xsd como si mapeara a la url http://somewhere/something.xsd
(así nunca acabas yendo a la web y descargando el fichero, simplemente existe localmente). Véase también https://stackoverflow.com/a/41225329/32453 para un poco más de información.