程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> LINQ學習筆記:實例化一個X-DOM

LINQ學習筆記:實例化一個X-DOM

編輯:關於.NET

實例化一個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所作的決定, 按順序:

  1. 如果對象是null, 它將被忽略
  2. 如果對象是基於XNode或者XStreamingElement, 它將被加入到Nodes集合當中
  3. 如果對象是一個XAttribute, 它將被加入到Attributes集合當中
  4. 如果對象是一個字符串, 它將被包裝為XNode節點並被加入到Nodes中
  5. 如果對象實現了IEnumerable, 它將被枚舉並且相同的規則會被用於每一個元素
  6. 否則, 對象將被轉換為一個string, 包裝成一個XText節點, 然後加入到Nodes中

所有的對象最終歸結到兩個單元中: 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對象實例化免於邊界的影響–這也是函數式編程的另外一個印記.

待續!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved