Xml命名空間淺析


XML實例

在介紹xml命名空間之前,我們先來看段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" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
        
  <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
      <map>
        <entry>
          <bean class="org.springframework.context.support.SimpleThreadScope"/>
        </entry>  
      </map>
    </property>
  </bean>
  
  <bean id="bar" class="x.y.Bar" scope="thread">
    <property name="name" value="Rick"/>
    <aop:scoped-proxy/>
  </bean>
  
</beans>

這段代碼摘自spring框架的某段配置代碼。

稍微分析一下:該段xml代碼中的諸多元素沒有使用任何前綴,因為它們的默認命名空間是 “http://www.springframework.org/schema/beans”, 該命名空間所對應的schema的地址:http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 

這段代碼還有另外一個以aop為前綴的命名空間"http://www.springframework.org/schema/aop", 該命名空間對應的schema地址:http://www.springframework.org/schema/aop/spring-aop-4.0.xsd

<aop:scoped-proxy/> 這段代碼就使用了以aop為前綴的scoped-proxy元素。

其他元素包括beans,bean,property,map等元素都是通過schema來定義的,下面我們就簡單看下schema的知識。

XML schema介紹

XML Schema 是基於 XML 的 DTD 替代者。
XML Schema 描述 XML 文檔的結構。
XML Schema 語言也稱作 XML Schema 定義(XML Schema Definition,XSD)。

  上面文字摘自W3C中對Schema的介紹。 沒錯,XML Schema就是用來描述XML文檔結構的。

 

下面我們就來簡單寫個schema文件:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.gogogo.com" xmlns="http://www.gogogo.com" elementFormDefault="qualified">
        
  <xs:element name="name" type="xs:string"/>
        
  <xs:element name="Employee">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="id" type="xs:int"/>
        <xs:element ref="name"/>
        <xs:element name="age" type="xs:int"/>
        <xs:element name="birth" type="xs:date"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  
</xs:schema>

這個簡單的schema表示的意思就是定義一個名字為Employee的復雜類型。 該元素分別擁有順序為id,name,age,birth這4個元素子元素。

XML 命名空間介紹

XML 命名空間提供避免元素命名沖突的方法。

  上面文字摘自W3C中對XML 命名空間的介紹。

 

怎么理解呢。其實這個命名空間跟.Net中的命名空間或Java中的package的概念是一樣的,就是用來解決一些命名沖突的。

舉個例子:

比如在A.xsd和B.xsd這2個Schema文件中都定義了Employee這個類型的元素。 那么如何區別這2個不用類型相同名字的Employee元素?  答案就是使用命名空間進行區分。

 

下面我們來分析一下本文定義的schema中的代碼:

下面我們通過另外一種方式重新寫下這段schema代碼:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.gogogo.com" xmlns:my="http://www.gogogo.com" elementFormDefault="qualified">
        
  <xs:element name="name" type="xs:string"/>
        
  <xs:element name="Employee">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="id" type="xs:int"/>
        <xs:element ref="my:name"/>
        <xs:element name="age" type="xs:int"/>
        <xs:element name="birth" type="xs:date"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  
</xs:schema>

代碼沒什么變化,只是不使用默認的命名空間了。將該schema對外的命名空間地址用在my前綴下。這樣ref name的時候就必須使用my前綴了,因為已經沒有了默認的命名空間,schema不知道怎么去找 "name" 這個元素。

 

看了2段代碼,總結一下schema中命名空間的使用:

            xml:你的前綴="你的命名空間地址"

examples:

            xml:my="http://www.my.org",   xml:omg="http://www.omg.org", xml:java="http://www.java.org"  ........

參考資料

http://www.w3school.com.cn/schema/index.asp

http://www.w3school.com.cn/xml/xml_namespaces.asp


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM