gpt4 book ai didi

关于可以添加到 XML 文档的元素的 XML namespace 信息?

转载 作者:数据小太阳 更新时间:2023-10-29 02:30:00 25 4
gpt4 key购买 nike

我对 XML 中的 namespace 有疑问。考虑我的 spring 应用程序中的 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"
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 期望的 namespace (对于任何 xml 解析器)将能够获取元素。告诉 XML 文档中可以包含哪些元素的不是 XSD 的工作吗?

我有这个疑问,任何澄清都会有所帮助。

我用 google 得到了我的答案,但不满意,因为无法消除疑虑。

最佳答案

"Does this server a purpose only as namespace (the way to avoid the naming conflict) OR what elements can be added into the xml document?"

后者。

Namesapces用于标识模式定义中的元素和属性。

"I was adding element (hibernate/spring configuration) and it complained that we need to add some namespace?"

用 Spring 做持久化,你通常需要 spring-orm jar ,spring-jdbc , spring-tx ,并且可能与其他一些人一起。一般来说,所有 spring-xxx jar 带有它们的模式定义。如上所述,如果您想在该特定模式中使用某个元素,则需要在上下文文件中添加命名空间。

您当前拥有的 namespace 只是 beanscontext命名空间。如果查看 xsds,您将看到这些 namespace 允许的所有顶级元素。例如, 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>

因为 beans 是文档的默认命名空间

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

您不需要像使用 <beans:bean> 一样为元素添加前缀(例如 <context:component-scan> )

至于你目前的问题“它提示我们需要添加一些命名空间”......你实际上没有提供足够的信息来帮助你调查问题,但通常在做持久性,你将需要 tx命名空间来处理事务,如果你想使用嵌入式数据库,你可能需要 jdbc 命名空间,带有 <jdbc:embedded-database>元素。

这只是一般的猜测。

" I have this doubts how come adding a namespace which spring expects (for the matter any xml parser) would be able to get the element. Isn't it the job of XSD which tells what all elements can be contained in an XML document?"

关于您的误解有点不清楚,但就像任何其他基于架构的 xml 一样,它需要验证。模式就像类定义。类定义是该类实例允许的内容的契约。

Spring,使用您的上下文来创建您定义的所有 bean。如果定义不正确,Spring 可能不知道如何处理您的 xml。这就是我们拥有模式的原因 - 为了遵循他的指导方针,更高级别的应用程序需要您遵循才能工作。

Spring 在后台所做的是获取您的 xml 文件,并使用相应的 NamespaceHandler ,它能够找到您需要的解析器。解析器的工作是创建允许 Spring 容器实例化 bean 的 bean 定义

示例流程:

<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 . Spring 将使用它来确定处理程序。

  • 查看 META-INF这包含在每个 spring-xxx.jar 中, 你会发现一个 spring.schemasspring.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" 的方法.这就是 Spring 知道要创建哪个 bean 的方式。此外,如果您查看上面的上下文文件,您将看到元素 <oxm:class-to-be-bound> .这是 <oxm:jax2b-marshaller> 的模式定义的一部分元素。您还可以在 doParse() 中看到它方法 - getChildElementsByTagName(element, "class-to-be-bound"); .

所有这些都是为了确保我们得到一个好的 Jaxb2marshaller 实例到底。它与 Spring 中的所有内容的工作方式几乎相同

所以您可以看到 Spring 在幕后发生了很多事情,希望您可以看到为什么需要命名空间。

关于关于可以添加到 XML 文档的元素的 XML namespace 信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25929359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com