XML命名空间如何工作

zig*_*ggy 16 java xml spring xsd xml-namespaces

<?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>
Run Code Online (Sandbox Code Playgroud)

上面的示例显示了具有多个名称空间的XML文件的示例.这些命名空间的目的是什么,最重要的是,即使没有Internet连接,它们也能正常工作?

我认为第二位开头xsi:schemaLocation包含XML模式文件,用于验证XML文档的结构.如果我在不在网络上的计算机上运行使用此配置文件的应用程序,为什么这些仍然有效?URL是否以某种方式别名为JAR文件?

Uku*_*kit 16

我们假设我们有这个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>
Run Code Online (Sandbox Code Playgroud)

它包括HTML,其具有对HTML呈现器具有语义含义的body标记.它还有另一个身体标签,其中包含有关特定人员的信息.命名空间定义此标记的语义范围.如果没有命名空间(如提供的示例中所示),解析器就无法区分它们,因为它们在语法上是相同的.

以下是同一文档的语义正确版本:

<?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>
Run Code Online (Sandbox Code Playgroud)

因此,由于命名空间,我们不必担心具有不同含义的冲突标记.

命名空间URI本身从未实际解析,并且是任意的(因此您可以脱机使用它们).

  • 为什么我们只需要使用url,为什么不使用一些唯一的词来分隔名称空间中的此标记。谢谢 (2认同)
  • @Mitch 我认为犯了一个错误。它应该是:&lt;human:body xmlns:body="http://www.example.com/human/"&gt; (2认同)

Mic*_*Kay 15

尝试忽略这样一个事实,即许多名称空间名称看起来像您可能在浏览器中键入的URL.它们只是随机字符串,它们不是Web上的资源地址.人们采用这种约定的原因在于它显示了谁"拥有"这个名字 - 它更清楚http://www.w3.org/2001/XMLSchema所指的比他们选择"xsd1.0"作为命名空间名称更清楚,并且它不太可能与其他人选择的名字意外冲突.有些人还喜欢将文档放在相关位置的事实,但没有XML软件会自动查找文档.