深入理解 c# 第十四章 一個通過 ExpandoObject實現簡單XML DOM 變換 建立DOM樹
class ExpandoXml
{
public static dynamic CreateDynamicXml(XElement element)
{
dynamic expando = new ExpandoObject();
//{System.Dynamic.ExpandoObject}
expando.XElement = element;
expando.ToXml = (Func<string>)element.ToString;
IDictionary<string, object> dictionary = expando;
//{System.Dynamic.ExpandoObject}
foreach (XElement subElement in element.Elements())
{
//subElement
//<book name="Mortal Engines"> <author name="Philip Reeve" /></book>
//<author name="Philip Reeve" />
//<books> <book name="Mortal Engines"> <author name="Philip Reeve" /> </book> <book name="The Talisman"> <author name="Stephen King" /> <author name="Peter Straub" /> </book> <book name="Rose"> <author name="Holly Webb" /> <excerpt> Rose was remembering the illustrations from Morally Instructive Tales for the Nursery. </excerpt> </book></books>
//<book name="The Talisman"> <author name="Stephen King" /> <author name="Peter Straub" /></book>
//等等
dynamic subNode = CreateDynamicXml(subElement);
//{System.Dynamic.ExpandoObject}
string name = subElement.Name.LocalName;
//"author" "book"
string listName = name + "List";
//"authorList" "bookList"
if (dictionary.ContainsKey(name))
{
((List<dynamic>) dictionary[listName]).Add(subNode);
}
else
{
dictionary[name] = subNode;
dictionary[listName] = new List<dynamic> { subNode };
}
}
return expando;
}
static void Main()//一個通過 ExpandoObject實現簡單XML DOM 變換 建立DOM樹
{
XDocument doc = XDocument.Load("books.xml");
//<books> <book name="Mortal Engines">
//<author name="Philip Reeve" /> </book> <book name="The Talisman">
//<author name="Stephen King" /> <author name="Peter Straub" />
//</book> <book name="Rose"> <author name="Holly Webb" />
//<excerpt> Rose was remembering the illustrations from
//Morally Instructive Tales for the Nursery. </excerpt> </book></books>
dynamic root = CreateDynamicXml(doc.Root);
Console.WriteLine(root.book.author.ToXml());
Console.WriteLine(root.bookList[2].excerpt.XElement.Value);
}
}
books.xml
<books>
<book name="Mortal Engines">
<author name="Philip Reeve" />
</book>
<book name="The Talisman">
<author name="Stephen King" />
<author name="Peter Straub" />
</book>
<book name="Rose">
<author name="Holly Webb" />
<excerpt>
Rose was remembering the illustrations from
Morally Instructive Tales for the Nursery.
</excerpt>
</book>
</books>
建立DOM樹
用expando建立一顆XML DOM的映象樹。
樹的每個節點都有兩個名/值對:XElement---儲存用於建立節點的原始LINQ to XML元素,
ToXml---儲存返回節點XML字串的委託。可以僅僅呼叫node.XElement.ToString()
返回字串,但這次我們要使用ExpandoObject和委託。需要指出的是,我們將使用ToXml
來代替ToString,因為設定expando的ToString屬性時不能覆蓋普通的ToString方法。這會
引起混淆,因此換了一個名字。
有趣的部分並不是固定的名稱,而是它依賴於真正的XML。
用遞迴處理工作。
輸出
<author name="Philip Reeve" />
Rose was remembering the illustrations from
Morally Instructive Tales for the Nursery.
相關文章
- 實現一個簡單的虛擬DOM
- 實現一個簡單的DOM diff演算法演算法
- PHP透過DOM操作XMLPHPXML
- virtual-dom原理與簡單實現
- XML DOM 替換節點概述XML
- 虛擬Dom與Diff的簡單實現
- 深入理解DOM事件機制事件
- 深入理解 React 的 Virtual DOMReact
- 理解Shadow DOM(一)
- 簡單理解slot演算法和shadow DOM演算法
- 說下你對DOM樹的理解
- 通過編寫簡易虛擬DOM,來學習虛擬DOM 的知識!
- 理解virtual dom的實現細節-snabbdom
- XML 檔案解析實踐 (DOM 解析)XML
- XML DOM(Document Object Model)XMLObject
- Python XML解析之DOMPythonXML
- 閱讀vue原始碼後,簡單實現虛擬domVue原始碼
- XML DOM Parse Error 物件概述XMLError物件
- XML DOM 解析器概述XML
- XML DOM 新增節點概述XML
- XML和Dom4jXML
- html DOM樹物件HTML物件
- React 虛擬Dom 轉成 真實Dom 實現原理React
- 揭秘Vue從Virtual DOM生成真實DOM的過程Vue
- XML DOM – 屬性和方法概述XML
- XML DOM 載入函式概述XML函式
- XML DOM 刪除節點概述XML
- react/vue中dom-diff簡易版實現ReactVue
- 關於 DOM 的理解
- Virtual-DOM的理解
- XML基本操作-建立(DOM和LOINQ)和LINQ查詢和儲存XML
- 簡單實現一個全面屏切換效果
- XML DOM 解析器錯誤概述XML
- XML DOM 瀏覽器差異概述XML瀏覽器
- c#實現最簡單的socket通訊C#
- Vue.js從Virtual DOM對映到真實DOM的過程Vue.js
- 深入框架本源系列 —— Virtual Dom框架
- 全域性 DOM 變數變數