Как работают пространства имен XML - PullRequest
14 голосов
/ 14 января 2012
<?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?

Ответы [ 4 ]

15 голосов
/ 14 января 2012

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

11 голосов
/ 14 января 2012

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

4 голосов
/ 14 января 2012

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

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

0 голосов
/ 07 апреля 2015

Пространство имен в общем, чтобы избежать конфликта между тегами, но за сценой это инструкция обработки для синтаксического анализатора для некоторой схемы.В браузере у вас есть, например, другой тип документа, строгий 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 активирует различные аннотации, обнаруживаемые в классах бинов: @Required @Autowired, @PostConstruct, @PreDestroy и @Resource и тому подобное.

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

Схема очень нужна, и по крайней мере ОДИН РАЗ необходимо загрузить ее, чтобы ваша IDE или приложение использовали ее для проверки, в противном случаеэто создаст исключение проверки.Если он доступен локально в этих банках, он не будет загружаться.

...