¿para qué sirve xsi: schemaLocation?

131

Veo que tenemos múltiples URL como valor de este atributo como en 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">

¿Por qué es necesario y para qué se utiliza? ¿Spring va a la url y valida? ¿Cuál es la diferencia entre xmlns y xsi: schemaLocation?

sab
fuente

Respuestas:

87

El analizador Java XML que usa Spring leerá los schemaLocationvalores e intentará cargarlos desde Internet para validar el archivo XML. Spring, a su vez, intercepta esas solicitudes de carga y sirve versiones desde dentro de sus propios archivos JAR.

Si omite el schemaLocation, el analizador XML no sabrá dónde obtener el esquema para validar la configuración.

skaffman
fuente
¿No buscaría el analizador XML la ruta de clase?
HDave
1
@skaffman, ¿Significa que cuando ejecuto la compilación Maven del proyecto basado en muelles con el indicador -o (fuera de línea), la compilación fallará a pesar del hecho de que todas las dependencias están disponibles en mi repositorio local?
aviad
@HDave Pero, ¿qué buscaría el analizador XML? El esquema podría tener cualquier nombre
Krzysztof Krasoń
Técnicamente, el analizador XML primero intentará cargar el esquema de internet, si no se encuentra o el acceso a internet no está disponible, buscará el archivo * .xsd localmente desde la ruta de clase, si aún no se encuentra, se omitirá.
Frank Zhang
Para obtener más información sobre la capa de intercepción de primavera, consulte stackoverflow.com/a/10768972/32453
rogerdpack el
68

Un xmlnses 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 elementos y nombres de 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 usar en un documento para proporcionar pistas sobre la ubicación física de los documentos de esquema que se pueden usar para la evaluación.

Oded
fuente
22

Según la especificación para localizar esquemas

puede o no 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 [intentar recuperar un xsd de la url del espacio de nombres] es una estrategia sensata predeterminada

(¡Gracias por ser inequívoco, especificación!)

y

en caso de que un autor del 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, se proporcionan los atributos de schemaLocation y noNamespaceSchemaLocation.

Básicamente, al especificar solo un espacio de nombres, su "XML" podría intentarse para ser validado contra un xsd en esa ubicación (incluso si carece de un schemaLocationatributo), dependiendo de su "comunidad". Si especifica un específico schemaLocation, entonces básicamente implica que el documento xml "debería" ser compatible con dicho xsd, así que "valídelo" (mientras lo leo). Mi conjetura es que si no haces un atributo schemaLocationo noNamespaceSchemaLocationsimplemente simplemente "no está validado" la mayoría de las veces (según las otras respuestas, parece que Java lo hace de esta manera).

Otra arruga aquí es que, por lo general, con la validación xsd en las bibliotecas de Java [ej .: archivos xml de config de primavera], si sus archivos XML especifican una schemaLocationurl xsd particular en un archivo XML, como xsi:schemaLocation="http://somewhere http://somewhere/something.xsd"típicamente dentro de uno de sus frascos de dependencia, contendrá 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 termines 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.

rogerdpack
fuente
0

Si entra en cualquiera de esas ubicaciones, encontrará lo que se define en ese esquema. Por ejemplo, le indica cuál es el tipo de datos del valor de las palabras clave del método ini.

Mojun Zhu
fuente