Solución:
El analizador XML de Java que usa Spring leerá el schemaLocation
valores e intente cargarlos desde Internet, para validar el archivo XML. Spring, a su vez, intercepta esas solicitudes de carga y entrega versiones desde dentro de sus propios archivos JAR.
Si omite el schemaLocation
, entonces el analizador XML no sabrá dónde obtener el esquema para validar la configuración.
Un xmlns
es un identificador único dentro del documento; no tiene que ser un URI para el esquema:
Los espacios de nombres XML proporcionan un método simple para calificar los nombres de elementos y atributos utilizados en documentos de Lenguaje de marcado extensible al asociarlos con espacios de nombres identificados por referencias URI.
xsi:schemaLocation
se supone que da una pista sobre la ubicación real del esquema:
se puede utilizar en un documento para proporcionar pistas sobre la ubicación física de los documentos del esquema que se pueden utilizar para la evaluación.
Según la especificación para localizar esquemas
puede o no puede haber un esquema recuperable a través del nombre del espacio de nombres … La comunidad de usuarios y / o los acuerdos de consumidor / proveedor pueden establecer circunstancias en las que [trying to retrieve an xsd from the namespace url] es una estrategia sensata por defecto
(¡gracias por ser inequívoco, especificación!)
y
en caso de que el autor de un documento (humano o no) haya creado un documento con un esquema particular a la vista, y garantiza que parte o la totalidad del documento se ajusta a ese esquema, schemaLocation y noNamespaceSchemaLocation [attributes] están provistos.
Entonces, básicamente, al especificar solo un espacio de nombres, su XML “podría” intentarse validar con un xsd en esa ubicación (incluso si carece de un schemaLocation
atributo), dependiendo de su “comunidad”. Si especifica un schemaLocation
, entonces básicamente implica que el documento xml “debería” ser conforme a dicho xsd, así que “por favor valídelo” (como lo leo). Supongo que si no haces un schemaLocation
o noNamespaceSchemaLocation
atributo simplemente “no está validado” la mayor parte del tiempo (basado en las otras respuestas, parece que Java lo hace de esta manera).
Otro problema aquí es que, por lo general, con la validación xsd en las bibliotecas de Java [ex: spring config xml files], si sus archivos XML especifican un schemaLocation
xsd url en un archivo XML, como xsi:schemaLocation="http://somewhere http://somewhere/something.xsd"
normalmente dentro de uno de sus frascos de dependencia Contiene una copia de ese archivo xsd, en su sección de recursos, y Spring tiene una capacidad de “mapeo” que dice tratar ese archivo xsd como si se asignara a la url http://somewhere/something.xsd
(para que nunca termine yendo a la web y descargando el archivo, solo existe localmente). Consulte también https://stackoverflow.com/a/41225329/32453 para obtener un poco más de información.