andrew4582

DynamicXML

Jul 13th, 2014
356
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.67 KB | None | 0 0
  1. using System;
  2. using System.Dynamic;
  3. using System.Reflection;
  4. using System.Xml.Linq;
  5. using System.Collections.Generic;
  6.  
  7. namespace Core.Dynamic
  8. {
  9.     /*
  10.  //Example
  11.  using System;
  12.  using Core.Dynamic;
  13.  
  14.  namespace ConsoleApplication1 {
  15.  class Program {
  16.      static void Main(string[] args) {
  17.              
  18.          dynamic contact = new DynamicXML("Contact");
  19.  
  20.          contact.Name = "Patrick Jones";
  21.          contact.Phone = "202-555-0487";
  22.          contact.Address = new DynamicXML();
  23.          contact.Address.Street = "123 Main St";
  24.          contact.Address.City = "Houston";
  25.          contact.Address.State = "TX";
  26.          contact.Address.Postal = "77001";
  27.              
  28.          Console.WriteLine(contact);
  29.  
  30.          string xml = DynamicXML.ToXml(contact);
  31.          dynamic cloned = new DynamicXML("Contact", xml);
  32.          Console.WriteLine(cloned.Name);    
  33.  
  34.   }
  35.  }
  36.  }
  37.   */
  38.  
  39.     public class DynamicXML : DynamicObject
  40.     {
  41.         public static XElement ToNode(DynamicXML dnode)
  42.         {
  43.             XElement element = new XElement(dnode._name);
  44.             foreach (var key in dnode._properties.Keys)
  45.             {
  46.                 var value = dnode._properties[key];
  47.                 if (value is DynamicXML)
  48.                     element.Add(ToNode(value as DynamicXML));
  49.                 else
  50.                     element.Add(new XElement(key, value));
  51.             }
  52.             return element;
  53.         }
  54.  
  55.         public static string ToXml(DynamicXML dnode)
  56.         {
  57.             return ToNode(dnode).ToString(SaveOptions.None);
  58.         }
  59.  
  60.         readonly Dictionary<string, object> _properties = new Dictionary<string, object>();
  61.         string _name;
  62.  
  63.         public DynamicXML() { }
  64.  
  65.         public DynamicXML(string name)
  66.         {
  67.             _name = name;
  68.         }
  69.  
  70.         public DynamicXML(string name, XElement element)
  71.         {
  72.             foreach (var item in element.Elements())
  73.             {
  74.                 if (item.HasElements)
  75.                     _properties[item.Name.ToString()] = new DynamicXML(item.Name.ToString(), item);
  76.                 else
  77.                     _properties[item.Name.ToString()] = item.Value;
  78.             }
  79.         }
  80.  
  81.         public DynamicXML(string name, string xml)
  82.         {
  83.             _name = name;
  84.             var doc = XDocument.Parse(xml);
  85.             var element = doc.Element(name);
  86.             foreach (var item in element.Elements())
  87.             {
  88.                 if (item.HasElements)
  89.                     _properties[item.Name.ToString()] = new DynamicXML(item.Name.ToString(), item);
  90.                 else
  91.                     _properties[item.Name.ToString()] = item.Value;
  92.             }
  93.         }
  94.  
  95.         public override string ToString()
  96.         {
  97.             return ToNode(this).ToString(SaveOptions.None);
  98.         }
  99.  
  100.         public override bool TrySetMember(SetMemberBinder binder, object value)
  101.         {
  102.             if (value.GetType() == typeof(DynamicXML))
  103.             {
  104.                 var dnode = value as DynamicXML;
  105.                 if (string.IsNullOrWhiteSpace(dnode._name))
  106.                     dnode._name = binder.Name;
  107.                 _properties[binder.Name] = dnode;
  108.             }
  109.             else
  110.                 _properties[binder.Name] = value;
  111.             return true;
  112.         }
  113.  
  114.         public override bool TryGetMember(GetMemberBinder binder, out object result)
  115.         {
  116.             result = null;
  117.             object value = null;
  118.             if (_properties.TryGetValue(binder.Name, out value))
  119.             {
  120.                 result = value;
  121.                 return true;
  122.             }
  123.             return false;
  124.         }
  125.     }
  126.  
  127. }
Advertisement
Add Comment
Please, Sign In to add comment