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

猜你喜欢

转载自blog.csdn.net/lizhihua0625/article/details/131094149