Advertisement
Guest User

XmlBuilder

a guest
Mar 31st, 2013
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.62 KB | None | 0 0
  1.  /// <summary>
  2.     /// Класс для быстрого построения Xml без сложных потребностей.
  3.     /// Синтаксис вида tag(attr1:attrValue,attr2:attrValue, elemTag1(...),elemTag2(...),
  4.     /// где tag,elemTag1,elemTag2 - экземпляры данного класса, "attr1","attr2" - имена атрибутов соответствующего тэга.
  5.     /// attrValue - значение атрибута.
  6.     /// На выходе выполнения метода - XDocument.
  7.     /// </summary>
  8.     /// <example>
  9.     /// dynamic tag1 = new XmlBuilder("tag1","");
  10.     /// dynamic tag2 = new XmlBuilder("tag2","");
  11.     ///
  12.     /// XDocument doc = tag1(name:"Tag1",
  13.     ///                      t21: tag2(name:"Tag21"),
  14.     ///                      t22: tag2(name:"Tag22"));
  15.     ///
  16.     /// На выходе:
  17.     /// <Tag1 name="Tag1">
  18.     ///    <Tag2 name="Tag21/>
  19.     ///    <Tag2 name="Tag22/>
  20.     /// </Tag1>
  21.     ///
  22.     /// Имена t21 и t22 даны только потому, что C# запрещает ставить именованные параметры раньше неименованных,
  23.     /// а атрибуты в начале нагляднее.
  24.     /// </example>
  25.     public sealed class XmlBuilder:DynamicObject
  26.     {      
  27.         private string _nmspace;
  28.         private string _name;
  29.  
  30.         /// <summary>
  31.         /// Initializes a new instance of the <see cref="XmlBuilder"/> class.
  32.         /// </summary>
  33.         /// <param name="name">Имя тэга.</param>
  34.         /// <param name="nmspace">Неймспейс.</param>
  35.         public XmlBuilder(string name,string nmspace)
  36.         {
  37.             _nmspace = nmspace;
  38.             _name = name;
  39.         }
  40.  
  41.         public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
  42.         {
  43.             var document = new XDocument();
  44.             document.Add(new XElement(XName.Get(_name, _nmspace)));
  45.          
  46.             var pairs = binder.CallInfo.ArgumentNames.Zip(args, (a, b) => new {name = a, value = b});
  47.             foreach (var pair in pairs)
  48.             {
  49.                 if (pair.value is XDocument)
  50.                 {
  51.                     var newElement = (pair.value as XDocument).Root;                    
  52.                     document.Root.Add(newElement);
  53.                 }
  54.                 else
  55.                 {
  56.                     document.Root.Add(new XAttribute(XName.Get(pair.name,_nmspace),pair.value??"{x:Null}"));
  57.                 }
  58.             }
  59.             result = document;
  60.             return true;
  61.         }
  62.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement