Подтвердить что ты не робот

Как работают пространства имен XML

<?xml version="1.0" encoding="UTF-8"?>

<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"
       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.1.xsd">

  <context:component-scan
      base-package="com.springinaction.chapter01.knight" />

</beans>

В приведенном выше примере показан пример XML файла с несколькими пространствами имен. Какова цель этих пространств имен и, самое главное, почему они работают даже там, где нет подключения к Интернету?

Я думаю, что второй бит, начинающийся с xsi:schemaLocation, содержит файлы схемы XML, которые используются для проверки структуры XML-документа. Почему они все еще работают, если я запускаю приложение, которое использует этот файл конфигурации на компьютере, который не находится в сети? Являются ли URL-адреса каким-то псевдонимом для JAR файлов?

4b9b3361

Ответ 1

Предположим, что у нас есть этот XML-документ.

<?xml version="1.0" encoding="UTF-8"?>
<html>
      <body>
        Your text here
      </body>
      <body>
        <height>182 cm</height>
        <weight>83 kg</weight>
      </body>
</html>

Он включает HTML, который имеет тег body с семантическим значением для средства визуализации HTML. Он также имеет еще один тег тела, который несет информацию о конкретном человеке. Пространство имен определяет семантическую область для этого тега. Без пространства имен (как в приведенном примере) синтаксически синтаксически невозможно разделить синтаксис анализатора.

Вот семантически корректная версия того же документа:

<?xml version="1.0" encoding="UTF-8"?>
<html:html xmlns:html="http://www.w3.org/TR/xhtml1/">
  <html:body>
    Your text here
  </html:body>
  <human:body xmlns:html="http://www.example.com/human/">
    <human:height>182 cm</human:height>
    <human:weight>83 kg</human:weight>
  </human:body>
</html:html>

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

Сами имена URI пространства имен фактически не разрешены и произвольны (поэтому вы можете использовать их в автономном режиме).

Ответ 2

Попытайтесь игнорировать тот факт, что многие имена пространства имен выглядят как URL-адреса, которые вы можете ввести в свой браузер. Это просто случайные строки символов, они не являются адресами ресурсов в Интернете. Причина, по которой люди согласны с этим соглашением, состоит в том, что он показывает, кто "владеет" именем - это более ясное, о чем говорит http://www.w3.org/2001/XMLSchema, чем если бы они выбрали "xsd1.0" в качестве имени пространства имен, и он менее вероятен для случайного конфликта с именем, выбранным кем-то другим. Некоторым людям также нравится, что вы можете разместить документацию в соответствующем месте, но никакое программное обеспечение XML не будет искать документацию автоматически.

Ответ 3

Пространство имен XML - это компонент имени элемента, который вы можете привязать к префиксу при написании xmlns:<prefix>="<namespace>". Это помогает избежать именования конфликтов между различными схемами XML, так что вы можете смешивать элементы из двух схем, которые имеют одно и то же имя. Например, у вас могут быть две схемы, у которых есть элементы link с разными значениями, а префикс пространства имен позволяет различать их, записывая либо foo:link, либо bar:link. Пространства имен обычно представляют собой URL-адрес, но парсер просто рассматривает его как строку, он не пытается извлечь что-либо из этого URL-адреса.

Вы правы относительно второй части, элемента XSI:SchemaLocation. См. этот ответ за то, почему он все еще может проверить схему без сетевого подключения.

Ответ 4

Пространство имен вообще заключается в том, чтобы избежать конфликта между тегами, но за сценой это инструкция обработки для синтаксического анализатора против некоторой схемы. В браузере у вас есть, например, другой тип документа, строгий Xhtml и т.д., Браузер имеет те схемы, которые где-то хранятся, и парсер ссылается на эти схемы для проверки структуры.

В Spring после включения конкретной схемы ему нужна ссылка, где эта схема существует, это не значит, что схема URI не имеет никакого значения. Связанные файлы .jar понадобятся в class-path, поэтому парсер ссылается на него. org.springframework.context-4.1.jar. Если вы заглянете в этот файл jar, вы найдете в пакете org.springframework.context.config, что присутствует файл spring -context-2.5.xsd. Вы определяете: xmlns:context="http://www.springframework.org/schema/context"

и

xsi:schemaLocation="http://www.springframework.org/schema/context/spring-context-2.5.xsd">

xmlns дает вам через ваш редактор использовать предварительно сконфигурированные средства для записи, например, <context tag, который исходит из xmlns:context, и позволяет проверять TAG как:

 <context:annotation-config> 

Что в TURN активирует различные аннотации, которые будут обнаружены в классах bean: @Required @Autowired, @PostConstruct, @PreDestroy и @Resource и т.д.

Таким образом, синтаксический анализатор найдет значение при разборе Beans.

Схема очень нужна, и по крайней мере ONCE нужно загрузить, что ваша IDE или приложение будет использовать для проверки, иначе она создаст исключение проверки. Если он локально доступен в этих банках, он не будет загружен.