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