<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      DynamicXml -- 動態讀取操作XML (一個從XML到Object的通用實現)

      最近的一個項目用到很多不同結構的XML文件. 于是就在網上搜索了一些文章, 結合實際遇到的問題寫成自己要的代碼.

      既然已經獲取了這方面的知識,不敢獨取, 拿出來共享. 這個也還不是很成熟, 希望大家共同完善, 提出寶貴意見, 共同進步.

      目標

      基于已經有的XML文件,例如:

      <root>
      <books>
      <book>
      <author>John Savacki</author>
      <title>E.G.Title</title>
      <price>20.50</price>
      </book>
      <book>
      <author>Tom Curly</author>
      <title>E.G.Title 2</title>
      <price>26.50</price>
      </book>
      </books>
      </root>
      或者是類似任意結構的XML文件, 可以實現初始化
      dynamic dx = new DynamicXml(xml);

      并且讀取屬性值:

      dx.books.book[0].author, dx.books.book[2].price

      解決方案

      自然是選擇C# 4.0 中引入的 DynamicObject, 關鍵是已有的.net框架中不能提供這樣的功能.

      那么就從這個類中繼承生成子類, 同時也需要實現 IEnumerable.

      稍微介紹一下:

      • DynamicObject 類使您能夠定義可以動態對象上執行哪些操作以及如何執行這些操作。

      如果只需要設置和獲取屬性的操作,您可以只覆蓋 TrySetMember 和 TryGetMember 方法。

       

      • IEnumerable 公開枚舉器,該枚舉器支持在非泛型集合上進行簡單迭代。

      應該大家都知道要實現自定義集合的IEnumerable 就要完成

      public IEnumerator GetEnumerator()

      也就是說, 為了實現需求, 至少我們需要完成三個函數:

      TrySetMember, TryGetMember, GetEnumerator

       

      實現

      通過上面的分析, 我們知道這個類看起來應該是這樣:

      public class DynamicXml : DynamicObject, IEnumerable
      {

      public DynamicXml(string text)
      {
      }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
      }

        public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
        {
        }

        public IEnumerator GetEnumerator()
        {
        }

      }

       

      在構造函數里我們希望可以讀取XML的內容, 加載所有元素的值.

      在TrySetMember中, 我們為設置成員值的操作提供實現, 以便為設置屬性值指定動態行為。在本文中, 我們只考慮讀取XML內容, 所以不需要重寫這個函數.

      在TryGetMember中, 我們要為獲取成員值的操作提供實現。

      在 TryGetIndex中,  我們要為按索引獲取值的操作提供實現.

       

      實現的代碼如下:

       


      public class DynamicXml : DynamicObject, IEnumerable
      {
      private readonly List<XElement> _elements;

      public DynamicXml(string text)
      {
      var doc = XDocument.Parse(text);
      _elements = new List<XElement> { doc.Root };
      }

      protected DynamicXml(XElement element)
      {
      _elements = new List<XElement> { element };
      }

      protected DynamicXml(IEnumerable<XElement> elements)
      {
      _elements = new List<XElement>(elements);
      }

      public override bool TryGetMember(GetMemberBinder binder, out object result)
      {
      result = null;
      if (binder.Name == "Value")
      result = _elements[0].Value;
      else if (binder.Name == "Count")
      result = _elements.Count;
      else
      {
      var attr = _elements[0].Attribute(
      XName.Get(binder.Name));
      if (attr != null)
      result = attr;
      else
      {
      var items = _elements.Descendants(
      XName.Get(binder.Name));
      if (items == null || items.Count() == 0)
      return false;
      result = new DynamicXml(items);
      }
      }
      return true;
      }

      public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
      {
      int ndx = (int)indexes[0];
      result = new DynamicXml(_elements[ndx]);
      return true;
      }

      public IEnumerator GetEnumerator()
      {
      foreach (var element in _elements)
      yield return new DynamicXml(element);
      }
      }

      運用

      在具體運用中, 有些地方是非常有趣的, 因為我們有了dynamic, 所以你可以用同一個變量去獲取不同結構的XML文件. 運用代碼如下:

       


      static void Main(string[] args)
      {
      string xml = @"<root>
      <books>
      <book>
      <author>John Savacki</author>
      <title>E.G.Title</title>
      <price>20.50</price>
      </book>
      <book>
      <author>Tom Curly</author>
      <title>E.G.Title 2</title>
      <price>26.50</price>
      </book>
      </books>
      </root>"
      ;
      dynamic dx = new DynamicXml(xml);
      Console.WriteLine("----- Book List -----");
      foreach (dynamic b in dx.books.book)
      {
      Console.WriteLine("author='{0}'", b.author.Value);
      print(b);
      }
      Console.WriteLine("------ Book List End ------");

      string xml2 = @"<root>
      <products>
      <product>
      <title>iPhone 4</title>
      <price>2222.50</price>
      <quantity>10</quantity>
      </product>
      <product>
      <title>Lenovo IdeaPad</title>
      <price>5432.50</price>
      <quantity>15</quantity>
      </product>
      </products>
      </root>"
      ;

      dx = new DynamicXml(xml2);

      Console.WriteLine("----- Product List -----");
      foreach (dynamic b in dx.products.product)
      {
      Console.WriteLine("quantity='{0}'", b.quantity.Value);
      print(b);
      }
      Console.WriteLine("------ Product List End ------");


      Console.Read();
      }
       
      我把print函數專門拿出來, 故弄玄虛一下, 因為兩個XML的結構有類似的地方, 所以可以同時使用下面的函數. -- 當然對于這樣的情況,我們也可以為此定義一個interface.
       

      static void print(dynamic b)
      {
      Console.WriteLine("Title='{0}'", b.title.Value);
      Console.WriteLine("price='{0}'", b.price.Value);
      }

      不是什么很深奧的東西, 但是希望可以為有同樣問題的朋友們節省一些時間.

      如果可以較好的掌握Dynamic, 可以節省一些反射方面的代碼. 不過這是另外一個話題了.

      本文來自于喜樂的ASP.NET(Alex Song) 轉貼請注明出處

       

      參考文章:

      Dynamic XML

      Fluent XML Parsing Using C#'s Dynamic Type Part 1 | CapTech ...
      posted @ 2011-12-14 04:18  擁有的都是恩典  閱讀(6242)  評論(14)    收藏  舉報
      主站蜘蛛池模板: 国产精品美女自慰喷水| 国产精品不卡一区二区三区| 亚洲欧美日韩综合久久| 人人人澡人人肉久久精品| 久久99国产精品尤物| 光山县| 大陆一级毛片免费播放| 综合色一色综合久久网| 亚洲最大日韩精品一区| 开心五月深深爱天天天操| 五月婷婷久久草| 一级国产在线观看高清| 亚洲欧美在线一区中文字幕| 视频一区二区 国产视频| 国产午夜A理论毛片| 日韩有码中文字幕av| 日韩中av免费在线观看| 久久久久久久久久久国产| 国产美女久久久亚洲综合| 2022最新国产在线不卡a| av一本久道久久综合久久鬼色| 国产成人麻豆亚洲综合无码精品| av新版天堂在线观看| 午夜av高清在线观看| 狠狠色噜噜狠狠狠狠777米奇| 亚洲一区二区三区激情在线| 97无码人妻福利免费公开在线视频| 老师破女学生处特级毛ooo片| 无码伊人久久大杳蕉中文无码| 日韩成av在线免费观看| 精品国产国语对白主播野战| 成人福利国产午夜AV免费不卡在线| 真人无码作爱免费视频| 中文无码乱人伦中文视频在线| 在线看高清中文字幕一区| 若尔盖县| 日韩无矿砖一线二线卡乱| 精品国产午夜福利在线观看| 欧美黑人添添高潮a片www| 在线播放深夜精品三级| 中文字幕av国产精品|