в чем польза xsi: schemaLocation?


131

Я вижу, что у нас есть несколько URL-адресов в качестве значения этого атрибута, как и весной:

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

Зачем он нужен и для чего он используется? Переходит ли Spring к URL-адресу и проверяет? в чем разница между xmlns и xsi: schemaLocation?

Ответы:


87

Парсер Java XML, который использует spring, будет читать schemaLocationзначения и пытаться загрузить их из Интернета, чтобы проверить XML-файл. Spring, в свою очередь, перехватывает эти запросы на загрузку и обслуживает версии из собственных файлов JAR.

Если вы опустите schemaLocation, тогда анализатор XML не будет знать, где взять схему, чтобы проверить конфигурацию.


Разве анализатор XML не будет искать путь к классу?
HDave

1
@skaffman, Значит ли это, что когда я запускаю maven build проекта на основе spring с флагом -o (offline), сборка завершится неудачно, несмотря на то, что все зависимости доступны в моем локальном репозитории?
aviad

@HDave Но что бы XML-парсер искал, у схемы могло бы быть любое имя
Кшиштоф Красонь

Технически синтаксический анализатор XML сначала попытается загрузить схему из Интернета, если он не найден или доступ в Интернет недоступен, он будет искать файл * .xsd локально из пути к классу, если он все еще не найден, он будет опущен.
Фрэнк Чжан

Для получения дополнительной информации о перехватывает слой ярового см stackoverflow.com/a/10768972/32453
rogerdpack

68

An xmlns- это уникальный идентификатор в документе - он не обязательно должен быть URI схемы:

Пространства имен XML предоставляют простой метод для определения имен элементов и атрибутов, используемых в документах расширяемого языка разметки, путем сопоставления их с пространствами имен, идентифицированными ссылками URI.

xsi:schemaLocation должен давать подсказку относительно фактического расположения схемы:

может использоваться в документе для указания физического расположения документов схемы, которые могут быть использованы для оценки.


22

Согласно спецификации для размещения схем

может быть, а может и не быть схема, извлекаемая через имя пространства имен ... Сообщество пользователей и / или соглашения с потребителем / поставщиком могут устанавливать обстоятельства, при которых [попытка получить xsd из URL-адреса пространства имен] является разумной стратегией по умолчанию

(спасибо за недвусмысленность, спец!)

и

в случае, если автор документа (человек или нет) создал документ с определенной схемой в представлении и гарантирует, что часть или весь документ соответствует этой схеме, предоставляются schemaLocation и noNamespaceSchemaLocation [атрибуты].

Таким образом, в основном с указанием только пространства имен, ваш XML «может» быть попытаться проверить на xsd в этом месте (даже если у него нет schemaLocationатрибута), в зависимости от вашего «сообщества». Если вы указываете конкретное schemaLocation, то в основном это означает, что XML-документ «должен» соответствовать указанному xsd, поэтому «пожалуйста, подтвердите его» (как я его читал). Я предполагаю, что если вы не выполняете атрибут schemaLocationили noNamespaceSchemaLocationатрибут, он просто «не проверяется» большую часть времени (судя по другим ответам, Java делает это таким образом).

Еще одна проблема заключается в том, что обычно при проверке xsd в java-библиотеках [например, XML-файлы конфигурации Spring], если ваши XML-файлы указывают конкретный schemaLocationURL-адрес xsd в XML-файле, как xsi:schemaLocation="http://somewhere http://somewhere/something.xsd"обычно в одном из ваших jar-файлов зависимостей, он будет содержать копию этот xsd-файл в разделе ресурсов, а spring имеет возможность «сопоставления», говоря, что этот xsd-файл обрабатывается так, как если бы он сопоставлялся с URL-адресом http://somewhere/something.xsd(так что вы никогда не заходите в Интернет и не загружаете файл, он просто существует локально). См. Также https://stackoverflow.com/a/41225329/32453 для получения дополнительной информации.


0

Если вы войдете в любое из этих мест, вы найдете то, что определено в этой схеме. Например, он сообщает вам, каков тип данных значения ключевых слов ini-метода.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.