в чем польза 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 не будет знать, где взять схему, чтобы проверить конфигурацию.

skaffman
источник
Разве анализатор 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 для получения дополнительной информации.

rogerdpack
источник
0

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

Моджун Чжу
источник