2011-06-27 76 views
3

在許多xml示例中,我看到很多甚至不使用xml的nameschemas,如下面的示例中我們已將nameschemas定義爲xsi,aop和一個默認 名稱空間。如果我們不使用它們來定義它們的目的。沒有附加XML,因爲它相當大。XML命名空間和配置屬性?

第二個問題是: - 假設我們使用這個nameschemas ..我們通常與一些網絡地址 像http://someAdddress//定義namechemas和schemalocation值。如果我們用ABC或其他任意值來定義它們會怎麼樣?它會有所不同嗎?我們從這些網址獲得的任何 處理?

<?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-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema 
/aop/spring-aop-2.0.xsd"> 

另一個問題是,我們已經定義了schemalocation爲XSI命名空間不僅沒有AOP的命名空間。爲什麼這樣?

最後一個問題是我們可以定義命名空間xsi1而不是xsi?它是否使任何im

回答

4

通常情況下,如果在文檔中未使用名稱空間綁定,則該名稱空間的聲明是多餘的,並且可以安全地省略(相反,它不會造成任何傷害通過在那裏)。我說應該是這樣,但也有例外。一種是DTD驗證,有時需要在特定元素上存在或不存在特定的名稱空間聲明(DTD處理不是名稱空間感知的,因此它將名稱空間視爲屬性)。另一個非常罕見的例外:我已經看到了XML詞彙表,其中命名空間聲明用於傳遞語義,而不是簡單地聲明命名空間前綴的綁定,例如它可能指示版本信息。這是糟糕的XML設計,但是有很多糟糕的XML設計。對於xsi:schemaLocation,有些工具/應用程序會忽略這一點,其他工具可能會將其解釋爲針對在特定位置找到的模式執行模式驗證的請求。

+0

非常感謝邁克爾。第二個問題是什麼呢? - 假設我們使用這個nameschemas ..我們通常用http:// someAdddress //這樣的網址來定義namechemas和schemalocation的值。如果我們用ABC或其他任意值來定義它們會怎麼樣?它會有所不同嗎?我們是否通過這些網址進行處理? –

0

在你的第一段中,你問過如果我們定義一個XML名稱空間而不使用它?

好吧,沒什麼不好的事情會發生。它只是供你使用,你不使用它。它就像你的函數中定義的一個變量,你不會使用它。

現在你的聲明中有一個錯誤,你不使用xsi,aop和默認命名空間。那是不正確的。因爲xsi是xml模式實例。你可以在你寫的下一行使用它<xsi:schemaLocation ... />它基本上可以讓你創建一個你在xsd/dtd文件中創建的模式定義的實例。您可能/可能沒有使用aop,除非您向我展示xml文件,否則我無法分辨。現在使用默認命名空間,你有點困惑。 XML文檔中的默認命名空間告訴模式驗證器,該XML文檔中使用的所有元素都在「<some namespace>」命名空間中聲明。請參閱標題爲「在XML文檔中引用架構」的標題下的http://www.w3schools.com/Schema/schema_schema.asp

現在你的第二個問題是所有的命名空間通常被定義爲一個url。我們可以將它定義爲其他名稱嗎?

是的,你可以。這裏是一個示例xsd和xml文件。

<?xml 
    version="1.0" 
    encoding="UTF-8" 
?> 

<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="mynamespace" 
    xmlns="mynamespace" 
    elementFormDefault="qualified" 
> 
    <xs:element name="note"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="to"> 
        <xs:complexType> 
         <xs:attribute name="lang" type="xs:string" use="required"></xs:attribute> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

這裏是XML:

<?xml 
    version="1.0" 
    encoding="utf-8" 
?> 

<note 
    xmlns:note="mynamespace" 
    xmlns="mynamespace" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="mynamespace myschema.xsd" 
> 
    <note:to lang="en"></note:to> 
</note> 

所以你可以看到,我已爲命名空間中定義的另一個名字,它完全在我的日食。

我想(我在這裏猜測)人們使用URI作爲命名空間是有原因的。因爲如果你只是保留一個名字,就像我做過「mynamespace」和其他人想要導入/使用你的模式一樣,那麼你的名字和他們的名字可能會相互衝突。現在你不能寫一個簡單的名字,並希望世界上的每個人都不會使用這個名字,所以人們使用URI作爲他們的名字空間,因爲URI是唯一的,並且沒有理由讓其他人在爲他們的應用程序創建模式時使用你的URI 。

你的第三個問題是爲什麼我們沒有像爲xsi那樣定義一個schemaLocation for app?再次查看您的schemaLocation。您已經定義了4個「空格分隔」值。 2個xsi和2個aop。

你最後的問題是你可以定義xsi1而不是xsi。您可以。事實上,你可以定義你想要的任何名字。它是一個用於表示名稱空間的簡寫變量。

PS:我最近開始學習XML/XSD。所以,如果你發現我的答案錯了,請分享正確答案,我將編輯我的答案。謝謝。