日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Use DynamicXElement to create xml

發(fā)布時(shí)間:2025/5/22 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Use DynamicXElement to create xml 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲一片| 国产精品久久久久久久久动漫 | 香蕉网站在线观看 | 精品国产免费看 | 男人日女人免费视频 | 久久av资源站 | 亚洲色图 在线视频 | 一级大片在线观看 | 国产美女主播在线观看 | 欧美精品 在线观看 | 国产精品久久免费 | 欧美成人三级在线观看 | 又黄又爽又色视频 | 超碰一区二区 | 色干综合| 欧美一区二区三区观看 | 新婚之夜玷污岳丰满少妇在线观看 | 欧美人与性动交g欧美精器 国产在线视频91 | 天天操天天舔 | 日本免费一区二区视频 | 天天射天天舔 | 91插插插影库永久免费 | 中文字幕视频免费观看 | 中文字幕视频 | 欧美日韩在线观看免费 | 日韩大片免费观看视频播放 | 色校园 | 中文字幕免费av | 伊人久久久久噜噜噜亚洲熟女综合 | 怡红院成人影院 | 亚洲性欧美色 | 国产精品一区二区三区免费在线观看 | 台湾a级艳片潘金莲 | 美女被日网站 | 爱爱视频一区 | 蜜桃成人av | 免费在线观看小视频 | 久久99热久久99精品 | 亚洲视频中文字幕在线观看 | 天堂在线精品 | 欧洲精品久久久久毛片完整版 | 一区二区三区欧美在线 | 成人动漫h在线观看 | 华人av在线 | 精品人妻无码一区二区三 | 成人女同av免费观看 | 亚洲欧美一二三区 | 性猛交xxxx乱大交孕妇2十 | 免费看日韩av | 国产又色又爽又高潮免费 | 97在线免费视频 | 深夜福利一区二区 | 97国产在线 | 婷婷爱爱| 亚洲av无码乱码国产精品久久 | 国产性猛交╳xxx乱大交一区 | 一区二区三区高清在线观看 | 国产精品一二三区 | 欧美一级做a爰片免费视频 成人激情在线观看 | 国产啪视频| 精品一区亚洲 | 成人精品一区二区三区电影黑人 | 我们2018在线观看免费版高清 | 女人高潮娇喘声mp3 乱色视频 | 日本一区视频在线 | 五月婷婷激情小说 | 美女福利视频一区 | 黄色中文 | 综合av一区| 国产精品无码无卡无需播放器 | 国产亚洲精品久久久久久青梅 | 国产一区二区三区黄 | 亚洲精品国产精品国自 | 免费看美女隐私网站 | 成人黄色免费视频 | 美女毛片在线观看 | 三级自拍视频 | 久久久久久久久免费视频 | 国产精品边吃奶边做爽 | 韩国电影一区二区三区 | 在线观看日本一区二区 | 中文字幕蜜臀 | 国产成人精品一区二区三区福利 | 国产日产精品一区 | 激情五月婷婷在线 | 国产精品日韩无码 | 日韩一级片在线播放 | 国产精品成人一区二区 | 蜜桃传媒一区二区亚洲 | 亚洲午夜片 | 窝窝视频在线 | 性欧美成人播放77777 | 日韩影院一区 | 在线视频欧美日韩 | 三级性视频| 特级特黄aaaa免费看 | 久久国产色av | 国产真实乱偷精品视频 | 未满十八岁勿进 |