深入理解 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演算法演算法
- 全面理解虛擬DOM,實現虛擬DOM
- virtual-dom原理與簡單實現
- vitual-dom原理與簡單實現
- PHP透過DOM操作XMLPHPXML
- 虛擬Dom與Diff的簡單實現
- 深入理解DOM事件機制事件
- 深入理解 React 的 Virtual DOMReact
- DOM解析XMLXML
- 理解Shadow DOM(一)
- 深入理解js Dom事件機制(一)——事件流JS事件
- xml解析之domXML
- 簡單理解slot演算法和shadow DOM演算法
- 使用PHP DOM-XML建立和解析XML檔案 (轉)PHPXML
- 理解virtual dom的實現細節-snabbdom
- 通過編寫簡易虛擬DOM,來學習虛擬DOM 的知識!
- jQuery物件轉換為dom物件簡單介紹jQuery物件
- 如何實現一個 Virtual DOM 演算法演算法
- Dom4j 讀寫XML簡介XML
- 閱讀vue原始碼後,簡單實現虛擬domVue原始碼
- XML 檔案解析實踐 (DOM 解析)XML
- 一起理解 Virtual DOM
- Python解析xml[xml.dom]PythonXML
- dom物件和jQuery物件相互轉換簡單介紹物件jQuery
- XML DOM(Document Object Model)XMLObject
- 如何實現一個 Virtual DOM 及原始碼分析原始碼
- 如何實現一個基於 DOM 的模板引擎
- 扒一扒spring,dom4j實現模擬實現讀取xmlSpringXML
- html DOM樹物件HTML物件
- React 虛擬Dom 轉成 真實Dom 實現原理React
- 揭秘Vue從Virtual DOM生成真實DOM的過程Vue
- 深度理解 Virtual DOM
- Python XML解析之DOMPythonXML
- XML DOM Parse Error 物件概述XMLError物件
- XML DOM 解析器概述XML
- PHP 原生 DOM 物件操作 XMLPHP物件XML
- dom4j解析xmlXML