控件在記憶體中建立 XmlTextWriter,利用 XmlSerializer 將 Nodes 屬性完整序列化為 XML 文件:
StringWriter myStrWriter = new StringWriter();
XmlTextWriter myXMLWriter = new XmlTextWriter(myStrWriter);
if (this.IndentXML && !this.GenerateAtServer) {
myXMLWriter.Indentation = 3;
myXMLWriter.IndentChar = ' ';
myXMLWriter.Formatting = Formatting.Indented;
}
XmlSerializer xser = new XmlSerializer(typeof(SkyTreeNodeList));
xser.Serialize(myXMLWriter, this.Nodes);
myXMLWriter.Close();
string xml = myStrWriter.ToString();
若 GenerateAtServer == true,採用伺服器端 XSLT 轉換:
string xslt = ReadXSLTString();
XmlDocument xsltDoc = new XmlDocument(); xsltDoc.LoadXml(xslt);
XmlDocument nodeDoc = new XmlDocument(); nodeDoc.LoadXml(xml);
StringWriter output = new StringWriter();
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(xsltDoc);
transform.Transform(nodeDoc, null, output);
writer.Write(output.ToString());
輸出 XML 資料島與初始化腳本,支援節點級動態載入:
// 容器與載入提示
writer.Write("<span id='" + this.ClientID + "_container'>正在載入...</span>");
// 節點資料 XML 資料島
writer.Write("<xml id='" + this.ClientID + "_xml'>" + xml + "</xml>");
// 啟動腳本
this.Page.ClientScript.RegisterStartupScript(
this.GetType(), "SkyTreeViewControl_Init_" + this.ClientID,
@"<script language=JavaScript>RefreshSkyTreeViewControl('" + this.ClientID + @"');</script>"
);
此雙模式架構讓開發者可根據節點數量、網路環境靈活切換渲染策略。