XML-пространство имен информация об элементах, которые могут быть добавлены в XML-документ?


У меня есть сомнения относительно пространства имен в XML. Рассмотрим пространство имен xml, которое у меня есть в приложении spring:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
    xmlns:context="http://www.springframework.org/schema/context">

Имеет ли этот сервер назначение только как пространство имен (способ избежать конфликта имен) или какие элементы можно добавить в xml-документ?

Я добавлял элемент (конфигурация hibernate/spring), и он жаловался, что нам нужно добавить некоторое пространство имен? Если пространство имен служит только способом избежать конфликта имен (XSD сообщает, какими могут быть все элементы содержится в xml-документе). У меня есть сомнения, как получилось, что добавление пространства имен, которое ожидает spring (в данном случае любой синтаксический анализатор xml), сможет получить элемент. Разве это не работа XSD, которая говорит, что все элементы могут содержаться в XML-документе?

У меня есть это сомнение, любое разъяснение было бы полезно.

Я сделал google, чтобы получить свой ответ, однако не удовлетворился, так как не смог избавиться от сомнений.

2 3

2 ответа:

" имеет ли этот сервер назначение только как пространство имен (способ избежать конфликта имен) или какие элементы можно добавить в xml-документ?"

Последнее.

Namesapces используются для идентификации элементов и атрибутов в определении схемы.

" я добавлял элемент (конфигурация hibernate/spring), и он жаловался, что нам нужно добавить некоторое пространство имен?"

Делая упорство с весной, вы обычно будете нуждаться банка spring-orm , spring-jdbc, spring-tx, и, вероятно, вместе с несколькими другими. Как правило, все банки spring-xxx поставляются со своими определениями схем. Как было указано выше, если вы хотите использовать элемент в этой конкретной схеме, вам нужно добавить пространство имен в файл контекста.

Текущие пространства имен, которые у вас есть, - это просто пространство имен beans и context. Если вы посмотрите на xsd, вы увидите все элементы верхнего уровня, разрешенные для этих пространств имен. Например, пространство имен beans допускает только <alias>, <bean>, <beans>, <description>, и <import>. А контекстное пространство имен поддерживает только

<context:annotation-config>
<context:component-scan>
<context:load-time-weaver>
<context:mbean-export>
<context:mbean-server>
<context:property-override>
<context:property-placeholder>
<context:spring-configured>

As beans-пространство имен по умолчанию для документа

<beans xmlns="http://www.springframework.org/schema/beans"

Вам не нужно добавлять префиксы к элементам (например, <beans:bean>), как это было бы с <context:component-scan>

Что касается вашей текущей проблемы "он жаловался, что нам нужно добавить некоторое пространство имен"... Вы на самом деле не предоставили достаточно информации, чтобы помочь Вам разобраться в проблеме, но обычно при выполнении настойчивости вам понадобится tx пространство имен для обработки транзакций, и если вы хотите использовать, скажем, встроенную базу данных, вам может понадобиться пространство имен jdbc с элементом <jdbc:embedded-database>.

Это всего лишь общие догадки.

" у меня есть сомнения, как получилось, что добавление пространства имен, которое spring ожидает (в данном случае любой синтаксический анализатор xml), сможет получить элемент. Разве это не работа XSD, которая говорит, что все элементы могут содержаться в XML-документе?"

Немного неясно относительно вашего недоразумение, но так же, как и любой другой xml, основанный на схеме a, он нуждается в проверке. Схема подобна определению класса. Определение класса является контрактом для того, что разрешено для экземпляров этого класса.

Spring, использует ваш контекст для создания всех бобов, которые вы определяете. Если они определены неверно, Spring может не знать, что делать с вашим xml. Вот почему у нас есть схемы - чтобы следовать его рекомендациям, приложение более высокого уровня нуждается в том, чтобы вы следовали в порядке работать.

То, что Spring делает под капотом, - это берет ваш xml-файл и, используя соответствующий NamespaceHandler, может найти нужный вам парсер. И задача синтаксического анализатора состоит в создании определений бобов, которые позволяют контейнеру Spring создавать экземпляры ваших бобов

Пример потока:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:oxm="http://www.springframework.org/schema/oxm"
    xsi:schemaLocation="http://www.springframework.org/schema/oxm 
                http://www.springframework.org/schema/oxm/spring-oxm-4.0.xsd
                http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd">

    <oxm:jaxb2-marshaller>
        <oxm:class-to-be-bound name="com.underdogdevs.spring.oxm.Application" />
    </oxm:jaxb2-marshaller>

</beans>
  • Используя пространство имен oxm для jaxb2-marshaller, которое определено в spring-oxm-4.0.xsd в одном из пакетов jar.

  • Обратите внимание на schemaLocation http://www.springframework.org/schema/oxm/spring-oxm-4.0.xsd. Весна будет использовать это для определения обработчика.

  • Посмотрите в META-INF, который входит в каждый spring-xxx.jar, Вы найдете файл spring.schemas и spring.handlers. Там вы найдете

    http\://www.springframework.org/schema/oxm/
          spring-oxm-4.0.xsd=org/springframework/oxm/config/spring-oxm-4.0.xsd
    
    http\://www.springframework.org/schema
         /oxm=org.springframework.oxm.config.OxmNamespaceHandler
    

    Это говорит spring, какая схема должна проверяться, и что обработчик пространства имен для использования является OxmNamespaceHandler, соответственно.

  • Если мы посмотрим на класс OxmNamespaceHandler, то найдем

    registerBeanDefinitionParser("jaxb2-marshaller",
                                 new Jaxb2MarshallerBeanDefinitionParser());
    

    Сейчас происходит то, что обработчик пространства имен направляет нас вправо. синтаксический анализатор.

  • Теперь посмотрите на Jaxb2MarshallerBeanDefinitionParser

    @Override
    protected String getBeanClassName(Element element) {
        return "org.springframework.oxm.jaxb.Jaxb2Marshaller";
    }
    
    @Override
    protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder beanDefinitionBuilder) {
        String contextPath = element.getAttribute("context-path");
        if (!StringUtils.hasText(contextPath)) {
            // Backwards compatibility with 3.x version of the xsd
            contextPath = element.getAttribute("contextPath");
        }
        if (StringUtils.hasText(contextPath)) {
            beanDefinitionBuilder.addPropertyValue("contextPath", contextPath);
        }
    
        List<Element> classes = DomUtils.getChildElementsByTagName(element, "class-to-be-bound");
        if (!classes.isEmpty()) {
            ManagedList<String> classesToBeBound = new ManagedList<String>(classes.size());
            for (Element classToBeBound : classes) {
                String className = classToBeBound.getAttribute("name");
                classesToBeBound.add(className);
            }
            beanDefinitionBuilder.addPropertyValue("classesToBeBound", classesToBeBound);
        }
    }
    

    Интересным моментом является метод getBeanClassName, который возвращает "org.springframework.oxm.jaxb.Jaxb2Marshaller". Вот как весна знает, какой Боб создать. Кроме того, если вы посмотрите на контекстный файл выше, вы увидите элемент <oxm:class-to-be-bound>. Это часть определения схемы для элемента <oxm:jax2b-marshaller>. Вы также можете увидеть его в методе doParse() - getChildElementsByTagName(element, "class-to-be-bound");.

Все это делается для того, чтобы в конце концов мы получили хороший пример Jaxb2marshaller. Это работает довольно примерно так же и со всем весной

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

Вы правы, что назначение пространств имен-избегать конфликтов имен.

Чего вам не хватает, так это того, что при использовании пространство имен становится частью имени. Да, это работа XSD, чтобы " сказать, что все элементы могут содержаться в XML-документе."Частью этой работы является управление именами, а пространства имен являются неотъемлемой частью имени элемента или атрибута.


обновите вопросы ОП в комментариях ниже...

Указание пространства имен связь между XSD и XML

Вы бы выиграли от основы использования XML-схемы для определения элементов. Обратите особое внимание на то, что

  • xsd:schema/@targetNamespace работает на стороне XSD , чтобы объявить пространство имен, которым он управляет.
  • @xsi:schemaLocation работает на стороне экземпляра XML-документа , чтобы подсказка о том, как найти xsd для каждого из пространств имен в игре.