DynamicXml.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*--------------------------------------------------------------------------
  2. * https://www.captechconsulting.com/blog/kevin-hazzard/fluent-xml-parsing-using-cs-dynamic-type-part-1
  3. * 博客园网友 夜の魔王 友情借用此代码,用于微信开发。
  4. * http://www.cnblogs.com/deepleo/
  5. *--------------------------------------------------------------------------*/
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Dynamic;
  10. using System.Xml.Linq;
  11. using System.Collections;
  12. public class DynamicXml : DynamicObject, IEnumerable
  13. {
  14. private readonly List<XElement> _elements;
  15. public DynamicXml(string text)
  16. {
  17. var doc = XDocument.Parse(text);
  18. _elements = new List<XElement> { doc.Root };
  19. }
  20. protected DynamicXml(XElement element)
  21. {
  22. _elements = new List<XElement> { element };
  23. }
  24. protected DynamicXml(IEnumerable<XElement> elements)
  25. {
  26. _elements = new List<XElement>(elements);
  27. }
  28. public override bool TryGetMember(GetMemberBinder binder, out object result)
  29. {
  30. result = null;
  31. if (binder.Name == "Value")
  32. result = _elements[0].Value;
  33. else if (binder.Name == "Count")
  34. result = _elements.Count;
  35. else
  36. {
  37. var attr = _elements[0].Attribute(XName.Get(binder.Name));
  38. if (attr != null)
  39. result = attr;
  40. else
  41. {
  42. var items = _elements.Descendants(XName.Get(binder.Name));
  43. if (items == null || items.Count() == 0) return false;
  44. result = new DynamicXml(items);
  45. }
  46. }
  47. return true;
  48. }
  49. public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
  50. {
  51. int ndx = (int)indexes[0];
  52. result = new DynamicXml(_elements[ndx]);
  53. return true;
  54. }
  55. public IEnumerator GetEnumerator()
  56. {
  57. foreach (var element in _elements)
  58. yield return new DynamicXml(element);
  59. }
  60. }