Use DynamicXElement to create xml
XML作為一種通用數(shù)據(jù)格式,.net進(jìn)行了專門的封裝。從開始的XMLDoc到現(xiàn)在的 Linq to XML一直不斷的簡化XML的操作。
.net4.0的出現(xiàn)給偶們帶來了dynamic特性,ExpandoObject和DynamicObject這2個(gè)類很拉風(fēng)~~~
比如我們要生成一段簡歷的XML:
?
<?xml version="1.0" encoding="utf-8"?><Resume>
<Name>Prime</Name>
<Date>2011/6/2</Date>
<City>Nanjing</City>
<Contact>
<QQ>277389861</QQ>
<MSN>prime.li@live.cn</MSN>
</Contact>
<A>
<B>
<C>
<D>
<E>
<City>Nanjing</City>
</E>
</D>
</C>
</B>
</A>
</Resume>
讓我們看看用Linq to XML是如何創(chuàng)建Resume.xml的:
public void Resume(){
XDocument doc = new XDocument();
var resume = new XElement("Resume");
resume.Add(new XElement("Name", "Prime"));
resume.Add(new XElement("Date", DateTime.Today.ToShortDateString()));
resume.Add(new XElement("City", "Nanjing"));
resume.Add(new XElement("Contact"));
resume.Element("Contact").Add(new XElement("QQ", "277389861"));
resume.Element("Contact").Add(new XElement("MSN", "prime.li@live.cn"));
resume.Add(new XElement("A", new XElement("B", new XElement("C", new XElement("D", new XElement("E", resume.Element("City")))))));
doc.Add(resume);
doc.Save("Resume.xml");
}
是不是比較麻煩呢?如果用我的DynamicXElement類可以這樣寫:
public void DynamicResume(){
dynamic resume = new DynamicXElement("Resume");
resume.Name = "Prime";
resume.Date = DateTime.Today.ToShortDateString();
resume.City = "Nanjing";
resume.Contact.QQ = "277389861";
resume.Contact.MSN = "prime.li@live.cn";
resume.A.B.C.D.E = resume.City;
resume.Save("DynamicResume.xml");
}
是不是感覺很干凈呢?而且讀起來很清晰明了,有層次感!O(∩_∩)O
其實(shí)實(shí)現(xiàn)起來很簡單,利用DyanmicObject,我們包裝一個(gè)XElement就可以搞定,如下:
public class DynamicXElement : DynamicObject{
public DynamicXElement(string name)
: this(new XElement(name))
{ }
public DynamicXElement(XElement element)
: this(element, true)
{ }
public DynamicXElement(string name, bool dyanmicCreateElement)
: this(new XElement(name), dyanmicCreateElement)
{ }
public DynamicXElement(XElement element, bool dyanmicCreateElement)
{
Element = element;
DynamicCreateElement = dyanmicCreateElement;
}
public XElement Element
{ get; private set; }
/// <summary>
/// 是否支持動(dòng)態(tài)創(chuàng)建節(jié)點(diǎn)
/// 比如你寫resume.A.B.C.D.E,其實(shí)A,B,C,D都是空的
/// true則會(huì)自動(dòng)創(chuàng)建A,B,C,D,E這些節(jié)點(diǎn),否則false則必須先創(chuàng)建好A,B,C,D這4個(gè)節(jié)點(diǎn)
/// </summary>
public bool DynamicCreateElement
{ get; private set; }
public static DynamicXElement Load(string uri)
{
var element = XElement.Load(uri);
return new DynamicXElement(element);
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var element = Element.Element(binder.Name);
if (element != null)
{
result = new DynamicXElement(element);
return true;
}
else
{
if (DynamicCreateElement)
{
var child = new XElement(binder.Name);
Element.Add(child);
result = new DynamicXElement(child);
return true;
}
else
{
result = null;
return false;
}
}
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
var element = Element.Element(binder.Name);
if (element != null)
{
element.SetValue(value);
}
else
{
if (value is DynamicXElement)
{
var child = new XElement(binder.Name);
var innerElement = ((DynamicXElement)value).Element;
child.Add(innerElement);
Element.Add(child);
}
else
{
Element.Add(new XElement(binder.Name, value));
}
}
return true;
}
public override bool TryConvert(ConvertBinder binder, out object result)
{
if (binder.Type.Equals(typeof(XElement)))
{
result = Element;
return true;
}
return base.TryConvert(binder, out result);
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
try
{
var flags = BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance;
result = typeof(XElement).InvokeMember(binder.Name, flags, null, Element, args);
return true;
}
catch
{
result = null;
return false;
}
}
}
如果還想有其他功能,你可以自己擴(kuò)展~~~
原理太簡單了,就是攔截所有的方法和屬性,然后自定義如何Handle。這樣其實(shí)我們可以在運(yùn)行時(shí)就可以增加屬性和方法等。
參考資料:.Net 4.0 DynamicObject使用(下)
轉(zhuǎn)載于:https://www.cnblogs.com/prime/archive/2011/06/02/DynamicXElement.html
總結(jié)
以上是生活随笔為你收集整理的Use DynamicXElement to create xml的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ajax Control Toolkit
- 下一篇: 百度逗你玩