實例化一個X-DOM
不使用Load或者Parse方法, 你還可以通過調用XContainer的Add方法手工實例化對象創建一棵X-DOM樹
為了創建一個XElement和XAttribute, 你只需要提供一個名稱和對應值
1: XElement lastName = new XElement ("lastname", "Bloggs");
2: lastName.Add (new XComment ("nice name"));
3:
4: XElement customer = new XElement ("customer");
5: customer.Add (new XAttribute ("id", 123));
6: customer.Add (new XElement ("firstname", "Joe"));
7: customer.Add (lastName);
8:
9: Console.WriteLine (customer.ToString());
輸出結果為:
1: <customer id="123">
2: <firstname>Joe</firstname>
3: <lastname>Bloggs<!--nice name--></lastname>;
4: </customer>
當構建一個XElement的時候, 一個value是可選的–你可以只提供元素名之後再添加內容. 注意當你確實提供了一個value的時候, 並不需要顯式創建並增加一個XText的子節點. X-DOM會自動幫我們完成這項工作, 因此你可以簡單地處理value字符串.
函數式構建
在之前的例子中, 我們通過代碼很難收集到整個XML的結構. X-DOM支持另外一種實例化的模式, 稱為函數式構建(來源於函數式編程). 使用函數式構建, 我們可以使用一個單一的表達式創建整棵樹:
1: XElement customer =
2: new XElement ("customer", new XAttribute("id", 123),
3: new XElement ("firstname","joe"),
4: new XElement ("lastname","bloggs",
5: new XComment ("nice name")
6: )
7: );
這會帶來兩個好處, 首先, 代碼與整個XML的結構非常相似, 其次, 可以和LINQ查詢集成. 例如, 可以通過下面的LINQ to SQL查詢將結構直接輸出為一個X-DOM:
1: XElement query =
2: new XElement ("customers",
3: from c in dataContext.Customers
4: select
5: new XElement ("customer",
6: new XAttribute("id", c.ID),
7: new XElement ("firstname", c.FirstName),
8: new XElement ("lastname", c.LastName,
9: new XComment ("nice name")
10: )
11: )
12: );
指定內容
函數式構建是可能的, 因為XElement(以及XDocument)的構造器都是重載並可接受一個params的對象數組
1: public XElement (XName name, params object[] content)
XContainer的Add方法也類似:
1: public void Add (params object[] content)
因此當創建或者添加一個X-DOM的時候你可以指定任意數量, 任意類型的子對象, 這是沒有任何問題的因為所有的事物都被認為是合法的內容. 要了解為什麼, 我們了解一下每一個內容對象在內部是如何被處理的. 以下這些是XContainer所作的決定, 按順序:
所有的對象最終歸結到兩個單元中: Nodes和Attributes. 此外, 任何的對象都是有效的內容因為它可以調用ToString並最終被包裝成為一個XText節點.
在調用任何類型的ToString之前, XContainer首先測試它是否是以下類型的其中一種:
float, double, decimal, bool, DateTime, DateTimeOffset, TimeSpan
如果是, 它會再次調用XmlConvert這個幫助類上面對應的ToString而不是對象本身的ToString方法. 這可以確保數據是round-trippable並且符合標准XML格式要求
自動深度克隆
當一個節點或者屬性(attribute)被加入到一個元素當中(不論是通過函數式構建還是通過調用Add方法), 該節點或者屬性的Parent屬性(property)被設置為該元素. 一個節點只能擁有一個父元素; 如果你將一個已經擁有父節點的節點加入到第二個父節點當中, 該節點將會被自動深度克隆. 這個自動復制讓X-DOM對象實例化免於邊界的影響–這也是函數式編程的另外一個印記.
待續!