jaki jest pożytek z xsi: schemaLocation?

132

Widzę, że mamy wiele adresów URL jako wartość tego atrybutu, jak na wiosnę:

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

Dlaczego jest potrzebny i do czego służy? Czy Spring przechodzi do adresu URL i sprawdza poprawność? Jaka jest różnica między xmlns i xsi: schemaLocation?

sab
źródło

Odpowiedzi:

88

Parser Java XML używany przez Spring odczyta schemaLocationwartości i spróbuje załadować je z Internetu, aby sprawdzić poprawność pliku XML. Spring z kolei przechwytuje te żądania ładowania i udostępnia wersje z własnych plików JAR.

Jeśli pominiesz schemaLocation, parser XML nie będzie wiedział, skąd pobrać schemat, aby sprawdzić poprawność konfiguracji.

skaffman
źródło
Czy parser XML nie przeszukałby ścieżki klasy?
HDave
1
@skaffman, czy to oznacza, że ​​kiedy uruchamiam maven build of Spring-based projhect z flagą -o (offline), kompilacja nie powiedzie się, mimo że wszystkie zależności są dostępne w moim lokalnym repozytorium?
aviad
@HDave Ale czego szukałby parser XML, schemat mógłby mieć dowolną nazwę
Krzysztof Krasoń
Z technicznego punktu widzenia parser XML najpierw spróbuje załadować schemat z Internetu, jeśli nie zostanie znaleziony lub dostęp do Internetu nie jest dostępny, przeszuka lokalnie plik * .xsd ze ścieżki klasy, jeśli nadal nie zostanie znaleziony, zostanie pominięty.
Frank Zhang
Aby uzyskać więcej informacji na temat warstwy przechwytującej sprężynę, zobacz stackoverflow.com/a/10768972/32453
rogerdpack.
68

xmlnsJest unikalnym identyfikatorem w dokumencie - nie trzeba być URI do schematu:

Przestrzenie nazw XML zapewniają prostą metodę kwalifikowania nazw elementów i atrybutów używanych w dokumentach Extensible Markup Language poprzez kojarzenie ich z przestrzeniami nazw identyfikowanymi przez odwołania URI.

xsi:schemaLocation ma dać wskazówkę co do faktycznej lokalizacji schematu:

może być użyty w dokumencie jako wskazówka co do fizycznej lokalizacji dokumentów schematu, które mogą być użyte do oceny.

Oded
źródło
22

Zgodnie ze specyfikacją dotyczącą lokalizacji schematów

schemat może być odzyskany przez nazwę przestrzeni nazw lub nie ... Umowy społeczności użytkowników i / lub konsumenci / dostawcy mogą ustalić okoliczności, w których [próba pobrania xsd z adresu url przestrzeni nazw] jest rozsądną strategią domyślną

(dzięki za jednoznaczność, spec!)

i

w przypadku, gdy autor dokumentu (człowiek lub nie) utworzył dokument z określonym schematem w widoku i gwarantuje, że część lub całość dokumentu jest zgodna z tym schematem, podawane są atrybuty schemaLocation i noNamespaceSchemaLocation [atrybuty].

Zasadniczo, określając tylko przestrzeń nazw, "może" zostać podjęta próba walidacji twojego XML względem xsd w tej lokalizacji (nawet jeśli nie ma schemaLocationatrybutu), w zależności od twojej "społeczności". Jeśli określisz konkretny schemaLocation, to w zasadzie oznacza to, że dokument xml „powinien” być zgodny ze wspomnianym xsd, więc „proszę go zweryfikować” (tak jak go czytam). Domyślam się, że jeśli nie wykonasz atrybutu schemaLocationlub, przez noNamespaceSchemaLocationwiększość czasu "nie jest sprawdzony" (na podstawie innych odpowiedzi wydaje się, że java robi to w ten sposób).

Innym problemem jest to, że zazwyczaj przy sprawdzaniu poprawności xsd w bibliotekach java [np. Pliki XML konfiguracyjne wiosny], jeśli twoje pliki XML określają konkretny schemaLocationadres URL xsd w pliku XML, tak jak xsi:schemaLocation="http://somewhere http://somewhere/something.xsd"zwykle w jednym z plików słoików zależności, będzie on zawierał kopię ten plik xsd w sekcji zasobów i spring ma możliwość "mapowania" mówiącą, że traktuje ten plik xsd tak, jakby był mapowany na adres URL http://somewhere/something.xsd(więc nigdy nie udajesz się do sieci i nie pobierasz pliku, po prostu istnieje lokalnie). Zobacz też https://stackoverflow.com/a/41225329/32453, aby uzyskać nieco więcej informacji.

rogerdpack
źródło
0

Jeśli wejdziesz do którejkolwiek z tych lokalizacji, znajdziesz to, co jest zdefiniowane w tym schemacie. Na przykład informuje, jaki jest typ danych wartości słów kluczowych metody ini.

Mojun Zhu
źródło