qual é o uso do xsi: schemaLocation?

131

Vejo que temos vários URLs como valor desse atributo, como na 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 que é necessário e para que é usado? O Spring vai para o URL e valida? qual é a diferença entre xmlns e xsi: schemaLocation?

sab
fonte

Respostas:

87

O analisador Java XML usado pela primavera lerá o schemaLocation valores e tentará carregá-los da Internet para validar o arquivo XML. O Spring, por sua vez, intercepta essas solicitações de carregamento e fornece versões de dentro de seus próprios arquivos JAR.

Se você omitir o schemaLocation, o analisador XML não saberá onde obter o esquema para validar a configuração.

skaffman
fonte
O analisador XML não pesquisaria o caminho da classe?
HDave
1
@skaffman, significa que quando eu executo uma compilação maven de projeto baseado em mola com a bandeira -o (offline), a compilação falhará, apesar do fato de todas as dependências estarem disponíveis no meu repositório local?
aviad 22/10/12
@HDave Mas o que o analisador de XML está procurando, o esquema pode ter qualquer nome
Krzysztof Krasoń
Tecnicamente, o analisador XML tentará primeiro carregar o esquema da Internet; se não for encontrado ou o acesso à Internet não estiver disponível, ele pesquisará o arquivo * .xsd localmente do caminho da classe; se ainda não for encontrado, será omitido.
Frank Zhang
Para mais informações sobre a camada de interceptação primavera, ver stackoverflow.com/a/10768972/32453
rogerdpack
68

An xmlnsé um identificador exclusivo no documento - ele não precisa ser um URI para o esquema:

Os espaços para nome XML fornecem um método simples para qualificar nomes de elementos e atributos usados ​​em documentos da Extensible Markup Language, associando-os a espaços para nomes identificados por referências de URI.

xsi:schemaLocation deve dar uma dica sobre a localização real do esquema:

pode ser usado em um documento para fornecer dicas sobre a localização física dos documentos de esquema que podem ser usados ​​para avaliação.

Oded
fonte
22

De acordo com as especificações para localizar esquemas

pode ou não haver um esquema recuperável por meio do nome do espaço para nome ... A comunidade de usuários e / ou os contratos de consumidor / provedor podem estabelecer circunstâncias nas quais [tentar recuperar um xsd do URL do espaço para nome] é uma estratégia padrão sensata

(obrigado por ser inequívoco, spec!)

e

caso um autor do documento (humano ou não) tenha criado um documento com um esquema específico em vista e garanta que parte ou todo o documento esteja em conformidade com esse esquema, são fornecidos os atributos schemaLocation e noNamespaceSchemaLocation [attribute].

Então, basicamente, ao especificar apenas um espaço para nome, seu XML "pode" tentar ser validado com relação a um xsd nesse local (mesmo que não possua um schemaLocationatributo), dependendo da sua "comunidade". Se você especificar um específico schemaLocation, basicamente significa que o documento xml "deve" estar em conformidade com o xsd, portanto, "por favor valide-o" (como eu o li). Meu palpite é que se você não fizer um schemaLocationounoNamespaceSchemaLocation atribui, ele simplesmente "não é validado" na maioria das vezes (com base nas outras respostas, parece que o java faz dessa maneira).

Outra desvantagem aqui é que, tipicamente, com validação xsd em bibliotecas java [ex: arquivos xml de configuração da primavera], se seus arquivos XML especificarem um schemaLocationURL xsd específico em um arquivo XML, como xsi:schemaLocation="http://somewhere http://somewhere/something.xsd"normalmente em um dos seus frascos de dependência, ele conterá uma cópia de esse arquivo xsd, em sua seção de recursos, e o spring possui um recurso de "mapeamento" para tratar esse arquivo xsd como se fosse mapeado para o URL http://somewhere/something.xsd(para que você nunca vá para a Web e faça o download do arquivo, ele existe apenas localmente). Consulte também https://stackoverflow.com/a/41225329/32453 para obter informações um pouco mais.

rogerdpack
fonte
0

Se você for a qualquer um desses locais, encontrará o que está definido nesses esquemas. Por exemplo, ele informa qual é o tipo de dados do valor das palavras-chave ini-method.

Mojun Zhu
fonte