2008-12-27 112 views
23

這將是這個XML數據的正確格式,它們是等價的還是兩者之間的權衡?最佳實踐:XML屬性vs XML元素 - 何時應使用元素以及何時應使用屬性?

1.

<sitemap> 
    <category name="Animals"> 
    <section title="Dogs"> 
     <page url="/pics/greatdane.jpg" title="Great Dane"/> 
    </section> 
    </category> 
</sitemap> 

2.

<sitemap> 
    <page> 
    <category>Animals</category> 
    <section>Dogs</section> 
    <title>Great Dane</title> 
    <url>/pics/greatdane.jpg</url>  
    </page> 
</sitemap> 

我已經實現了第一個例子與我的樣式表,它似乎做工精細,但我不能確定什麼樣的正確形式應是。

+1

這是一個不錯的標題的好問題。 – 2008-12-27 23:15:43

+0

是的,真的很好的問題,但請更改標題。 – 2008-12-28 00:33:06

回答

20

屬性與元素的問題已經出現在十年的大部分時間裏,沒有正確的答案。相反,考慮差異和你應該能夠決定使用哪種:

  • 可以有一個屬性只有一個實例,雖然你可以使用DTD或XML Schema元素執行本;
  • 屬性無序。元素不是;
  • 如果沒有孩子,則屬性會導致更簡潔的語法。比較:

    <頁面名稱= 「網站地圖」/>

到:

<page> 
    <name>Sitemap</name> 
</page> 

我知道我喜歡哪一個;

  • 不是真的有關,因爲現在的DTD不使用多少(如果有的話)在XML架構,但無論如何,我會添加:允許DTD中的默認值(暗示)的屬性,但沒有這樣的機制,要素;和
  • 作爲elementss的元素可以擁有自己的子元素和屬性。屬性顯然不能。

所以,從你的榜樣,你的內心<page>元素有一個URL屬性(雖然這是出於某種原因的圖像 - 也許預覽圖標,如果是這樣的屬性名稱是誤導)。一個網頁只有一個URL(通常),因此這可能是某個屬性的好例子。

另一方面,如果你想列出頁面上的圖像,顯​​然可能有多個,所以你需要的元素。

但是,最後,大多數時候沒有正確或錯誤的答案,這主要是一個風格問題。

2

這類事情通常沒有正確或錯誤的答案。主要取決於你如何訪問你的數據。

第一個問題的一個好處是,它很容易(也許以後)能夠支持某個分類中的多個頁面和一個分類中的多個分段。第二個信息是跨頁面傳播的。

2

XML是可怕的文件格式,並最終在宗教戰爭。只要你能證明這一點,你就可以做任何你感覺最好的事情。但是,您的特定示例顯着不同:

1,sitemap封裝封裝封裝頁面的部分的類別。

2,站點地圖封裝了一個封裝了三個項目的頁面:category,section,title和URL。這三個項目都沒有包含任何其他項目,它們都是兄弟姐妹,通常都在頁面中。

作爲兩種不同的結構,它取決於你的意圖。

另一個問題是偏好屬性與第一級標籤。但正如我所說,這是一個不同的問題!

1

我更喜歡第二個。元素應該用來描述數據(這主要是你在做什麼)。屬性用於與數據無關的值,例如元素的最大大小。

12

這兩個示例並不等價,因爲它們形成不同的層次結構。網站地圖是類別列表,就像第一個例子一樣?還是像第二個例子那樣的頁面列表?

答案是正交於元素與屬性問題。

在元件VS屬性問題: 這裏是變換到一個屬性的方法的第二個例子:

<sitemap> 
<page  
    category='Animals' 
    section='Dogs' 
    title='Great Dane' 
    url='/pics/greatdane.jpg' 
    /> 
</sitemap> 

上面和你的第二種情況是等價的。選擇一個還是另一個的一個考慮因素是基於您是否可以在將來修改架構。如下例所示,向url元素添加一個屬性可能是一個向後兼容的更改。在屬性方法中,語義上相同的修改是不可能的,因爲您無法將屬性附加到屬性。

<sitemap> 
<page>  
    <category>Animals</category> 
    <section>Dogs</section>  
    <title>Great Dane</title>  
    <url nofollow="true">/pics/greatdane.jpg</url> 
</page> 
</sitemap> 
1

IBM發佈了題爲Principles of XML Design的文章,提供有關何時使用屬性與元素的一些準則。我發現這篇文章有用,你的里程可能會有所不同。

1

第一替代縮放好一點屬性。假設您需要添加動物節的另一個屬性,例如節的狀態。我認爲,這表示:

<sitemap> 
    <category name="Animals"> 
    <section title="Dogs" status="draft"> 
     ... 
    </section> 
    </category> 
</sitemap> 

確實傳達了以下事實的一個更好的工作:

  1. 名是該類別的屬性
  2. 類別可以有多個部分
  3. 狀態部分的財產;並非所有類別中的所有部分都必須具有相同的狀態。

總之,它使分層結構更加清晰,並顯示哪些屬性適用於層次結構的每個級別。

3

我認爲,答案是很明顯的,當你想想你要如何添加更多的狗:

<sitemap> 
    <category name="Animals"> 
    <section title="Dogs"> 
     <page url="/pics/greatdane.jpg" title="Great Dane"/> 
     <page url="/pics/wienerdog.jpg" title="Wiener Dog"/> 
    </section> 
    </category> 
</sitemap> 

<sitemap> 
    <page> 
    <category>Animals</category> 
    <section>Dogs</section> 
    <title>Great Dane</title> 
    <url>/pics/greatdane.jpg</url>  
    </page> 
    <page> 
    <category>Animals</category> 
    <section>Dogs</section> 
    <title>Wiener Dog</title> 
    <url>/pics/wienerdog.jpg</url> 
    </page> 
</sitemap> 
1

一個簡單的經驗法則:如果你能實現數據結構作爲名稱/值對的無序映射,您可以使用元素的屬性來表示它。如果你不能(例如,如果你有多個名字,或者給定的名字會有多個關聯值,或者名稱/值對的排序是重要的),那麼帶有屬性的元素是錯誤的表示。其他

有兩件事情可以使這個錯誤表示:

  • 值包含標記。這可以表示屬性值,但它很尷尬,因爲所有的標記字符必須轉義爲實體。另外,標記不會被解析。
  • 您正在使用XML Schema驗證,並且有多個允許的一組名稱/值對。 XML Schema只能爲一個元素定義一組允許的屬性,而它可以定義多個互斥的可允許的子元素集合。

使用屬性的一個顯而易見的好處是它們導致了精確的XML。它們的分析速度也比元素快(非常快)。

相關問題