C#DynamicXml动态读取操作XML(XML到Object的通用实现) 修改

using Newtonsoft.Json.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Xml.Linq;

namespace UmlDemo1
{

    //var xml = @"<root>
    //    <books>
    //        <book is_read=""false""><author>Test</author></book>
    //        <book is_read=""true""><author>Test2</author></book>
    //    </books>
    //</root>";

    //dynamic data1 = new DynamicXml(xml);
    //Console.WriteLine(data1.books.book[0].author.ToString());
    internal class DynamicXml : DynamicObject, IEnumerable
    {
        private readonly List<XElement> _elements;

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

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

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

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = null;

            if (binder == null || string.IsNullOrEmpty(binder.Name))
                return false;

            if (binder.Name == "Value")
            {
                result = _elements[0].Value;
            }
            else if (binder.Name == "Count")
            {
                result = _elements.Count;
            }
            else
            {
                // Look for attributes with the given name
                var attr = _elements[0].Attribute(XName.Get(binder.Name));
                if (attr != null)
                {
                    result = attr.Value;
                }
                else
                {
                    // Look for descendant elements with the given name
                    var items = _elements.Descendants(XName.Get(binder.Name));
                    if (items == null || !items.Any())
                    {
                        return false;
                    }

                    result = new DynamicXml(items);
                }
            }

            return true;
        }

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

            if (indexes == null || indexes.Length != 1 || !(indexes[0] is int))
                return false;

            int index = (int)indexes[0];

            if (index < 0 || index >= _elements.Count)
                return false;

            result = new DynamicXml(_elements[index]);

            return true;
        }

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

        public override string ToString()
        {
            if (_elements.Count == 1 && !_elements[0].HasElements)
            {
                return _elements[0].Value;
            }

            return string.Join("\n", _elements);
        }
    }
}

应用的时候稍微改一下,就是需要添加


```csharp
using System.Xml.Linq;

工具,nuget 包管理添加

System.Xml.Linq

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值