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 ответа:
" имеет ли этот сервер назначение только как пространство имен (способ избежать конфликта имен) или какие элементы можно добавить в 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 для каждого из пространств имен в игре.