какая польза от xsi: schemaLocation? - PullRequest
123 голосов
/ 04 мая 2011

Я вижу, что у нас есть несколько 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">

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

Ответы [ 4 ]

82 голосов
/ 04 мая 2011

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

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

66 голосов
/ 04 мая 2011

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

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

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

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

20 голосов
/ 22 января 2015

В соответствии со спецификацией для поиска схем

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

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

и

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

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

Другой недостаток заключается в том, что, как правило, при проверке xsd в библиотеках java [ex: spring config xml files], если ваши XML-файлы указывают конкретный schemaLocation xsd url в 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 голосов
/ 02 ноября 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...