XML 元素可以在開始標簽中包含屬性,類似 Html。
屬性 (Attribute) 提供關於元素的額外信息。
XML 屬性
從 Html,你會回憶起這個:<img src="computer.gif">。"src" 屬性提供有關 <img> 元素的額外信息。
在 Html 中(以及在 XML 中),屬性提供有關元素的額外信息:
<img src="computer.gif">
<a href="demo.ASP">
屬性通常提供不屬於數據組成部分的信息。在下面的例子中,文件類型與數據無關,但是對需要處理這個元素的軟件來說卻很重要:
<file type="gif">computer.gif</file>
XML 屬性必須加引號
屬性值必須被引號包圍,不過單引號和雙引號均可使用。比如一個人的性別,person 標簽可以這樣寫:
<person sex="female">
或者這樣也可以:
<person sex='female'>
注釋:如果屬性值本身包含雙引號,那麼有必要使用單引號包圍它,就像這個例子:
<gangster name='George "Shotgun" ZIEgler'>
或者可以使用實體引用:
<gangster name="George "Shotgun" ZIEgler">
XML 元素 vs. 屬性
請看這些例子:<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
在第一個例子中,sex 是一個屬性。在第二個例子中,sex 則是一個子元素。兩個例子均可提供相同的信息。
沒有什麼規矩可以告訴我們什麼時候該使用屬性,而什麼時候該使用子元素。我的經驗是在 Html 中,屬性用起來很便利,但是在 XML 中,您應該盡量避免使用屬性。如果信息感覺起來很像數據,那麼請使用子元素吧。
我最喜歡的方式
下面的三個 XML 文檔包含完全相同的信息:
第一個例子中使用了 date 屬性:<note date="08/08/2008">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting this weekend!</body>
</note>
第二個例子中使用了 date 元素:<note>
<date>08/08/2008</date>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting this weekend!</body>
</note>
第三個例子中使用了擴展的 date 元素(這是我的最愛):<note>
<date>
<day>08</day>
<month>08</month>
<year>2008</year>
</date>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting this weekend!</body>
</note>
避免 XML 屬性?
因使用屬性而引起的一些問題:
屬性無法包含多個值(子元素可以)
屬性無法描述樹結構(子元素可以)
屬性不易擴展(為未來的變化)
屬性難以閱讀和維護
請盡量使用元素來描述數據。而僅僅使用屬性來提供與數據無關的信息。
不要做這樣的蠢事(這不是 XML 應該被使用的方式):<note day="08" month="08" year="2008"
to="George" from="John" heading="Reminder"
body="Don't forget the meeting this weekend!">
</note>
針對元數據的 XML 屬性
有時候會向元素分配 ID 引用。這些 ID 索引可用於標識 XML 元素,它起作用的方式與 Html 中 ID 屬性是一樣的。這個例子向我們演示了這種情況:<messages>
<note id="501">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting this weekend!</body>
</note>
<note id="502">
<to>John</to>
<from>George</from>
<heading>Re: Reminder</heading>
<body>I will not</body>
</note>
</messages>
上面的 ID 僅僅是一個標識符,用於標識不同的便簽。它並不是便簽數據的組成部分。
在此我們極力向您傳遞的理念是:元數據(有關數據的數據)應當存儲為屬性,而數據本身應當存儲為元素。