我看到使用該示例XML中的屬性沒有任何問題。屬性具有許多元素所沒有的限制,以及一些顯着的優點。
首先,限制:
- 屬性可能只包含簡單內容。
- 屬性名稱在元素中必須是唯一的。根據定義,屬性的排序在XML中並不重要;您不能依靠DOM來按照任何特定順序遍歷或保存屬性。
- 屬性不是節點,這意味着您在XPath中訪問它們時存在一些偏心(例如,在XSLT標識轉換中使用的模式
node() | @*
)以及在DOM中(例如,NET,XmlAttribute
派生自XmlNode
即使屬性不是節點,並且XmlAttributeCollection
不是派生自XmlNodeList
即使它是一個XmlNode
對象的列表 - 這是有很好的理由,但它是相當混亂,如果你是新來的它)。
的顯著優點:
- 由於屬性名必須是一個元素中是唯一的,並且只能包含簡單內容,對DOM方法來設置和獲取屬性值是顯著簡單比DOM使用在元素中設置和獲取值的方法。
- 由於屬性排序並不重要,因此不需要創建和使用屬性來關注排序的代碼。
- 由於屬性只能包含簡單內容,因此爲它們編寫模式定義會更容易。
- 屬性的標記比元素的標記更簡潔。
屬性同構到地圖/字典非常乾淨。您可以使用屬性作爲任何由名稱/值對組成的數據結構的可持久化形式,只要可以將名稱限制爲有效的XML名稱並將值限制爲文本 - 並且只要構建它所執行的數據結構無論你填充什麼樣的順序。
(這可能會導致很大的問題。在WPF中,你可以使用XAML中的屬性來存儲對象屬性的值,它們在設置時會產生副作用。對於難以診斷的錯誤 - 僅僅因爲您在設置SelectedItem
之前在您的XAML中設置了Binding
並不意味着XamlReader
將在構建XAML所代表的對象時嘗試設置SelectedItem
在一個沒有Binding
的物體上,它會拋出一個e xception。你可以整天看看你的XAML,看不出爲什麼會發生這種情況。)
在代碼中,使用屬性的好處是不言而喻的。來設置和使用XmlDocument
DOM(在C#)得到的元件上的foo
屬性的值:
elm.SetAttribute("foo", value);
value = elm.GetAttribute("foo");
設置和元件上得到一個foo
元件的值:
XmlElement fooElm = (XmlElement)elm.SelectSingleNode("foo");
if (fooElm == null)
{
elm.OwnerDocument.CreateElement("foo");
elm.AppendChild(fooElm);
}
fooElm.InnerText = value;
XmlElement fooElm = (XmlElement)elm.SelectSingleNode("foo");
value = fooElm != null ?? fooElm.InnerText : "";
確實有更高效的方法來完成上述操作(編寫幫助程序方法,使用XDocument
而不是XmlDocument
,或者完全避免使用DOM並使用序列化),但使用元素本身就更復雜。
在你的例子中,使用屬性可能是可以的;它看起來像是一個簡單的名稱/值對映射,其排序無關緊要。例外可能是標題;如果有人希望允許它們包含標記,那麼你會感到悲傷。
編輯:
其實,我相信XamlReader
將處理在它們出現在XAML的順序屬性,因此,如果你在你的XAML SelectedItem
之前設置Binding
它可能不會導致異常 - 所以只要XamlReader
正在從XAML的實際文本中讀取。實際上,讀取和寫入XML文檔的工具會改變XAML文檔中屬性的排序。 KaXaml是否保留了它所編輯的XAML文檔中屬性的順序?它不應該有到。
無論如何,在XAML解決方法很簡單:不是這樣:
<ListBox Binding="{...}" SelectedItem="..." ... />
做到這一點:
<ListBox>
<ListBox.Binding>...</ListBox.Binding>
<ListBox.SelectedItem>...</ListBox.SelectedItem>
...
順便說一句,這是很好的詢問最佳實踐,但我不會」建議改變一個沒有損壞的工作系統,除非你需要增加你的計費時間:-) – NVRAM 2009-11-20 16:22:23