1、模板解析引擎使用外部组件实战引言随着 08 年 3 月 SiteFactory CMS 正式版的发布,动易网络正式拉开了下一代网站管理应用的序幕,并提供了一个高度的稳定、灵活、安全、易用的管理环境。08 年 12 月,动易网络正式发布了 SiteFactory 2.0 以及 BizIeda 2.0 版本,这是一个更加重要的升级和里程碑版本。毫无疑问,你已经知道 SiteFactory 独创的 Xpower 模板解析引擎聚合了紧密相关的多种技术,彻底改变了传统模板解析的不足和局限性。而标签解析引擎是 SiteFactory 中最重要的部件,你要用它去转换数据至 Web 呈现。SiteFactor
2、y 的用户很容易对标签解析引擎技术感兴趣,毫不夸张的说,SiteFactory 的Xpower 引擎是针对转换数据呈现最为完整的技术平台。 Xpower 引擎输出页面的每一个字节都交给了用户进行控制、多种数据源的支持、丰富的函数库。本教程将讲述 Xpower 引擎对外部组件的支持。读者对象本教程是针对有一定服务端 Web 开发知识的开发者。本教程没有完整的描述教程所涉及到的每一个细节,否则,那样可能是好几本书的大辞典(比如如何去写 C#代码) 。相反,本教程为开发者提供精练的 Xpower 引擎对外部组件的技术介绍,而这类读者基本上都不想去重复那些最基本的概念。在阅读本教程的过程中,你要关注的
3、是需要用来构建专业网站管理应用程序 SiteFactory 的 Xpower 模板解析引擎技术。为了更好的理解本教程,你最好熟悉 C#语法,XSLT 转换以及面向对象的概念。如果你熟悉 Java 或者 C+但没有用过.NET。否则你可能需要同时考虑阅读一些介绍.NET 的书籍。学习本教程的硬件和软件环境你需要一个安装有 Visual Studio(也可以选择免费 Sharp Developer、Visual Studio Web Developer Express) 、SiteFactory 2.0 的电脑来配合阅读本教程。虽然理论上说你可以手写代码,但这是极其乏味的,并且极易出错,所以在专业
4、环境下从来不用这种方法。客户支持我们非常重视读者的反馈,我们也希望能了解你对本教程的看法哪些是你喜欢的地方,哪些是你不喜欢的地方,还有你希望我们应该在下次改进的地方,以及你更希望关注 SiteFactory 哪方面的教程,甚至是你觉得标签解析引擎在哪里需要改进。你可以至(动易官方论坛)参与讨论。示例代码在本教程的末尾有与本教程配套的示例代码,在使用这些代码之前,需要解压缩下载文件。本教程的示例代码项目版本为 Visual Studio 2008 你可能需要相应或者更高的版本来打开。模板解析引擎使用外部组件实战(一) 建立类库项目:如下图所示,在新建项目对话框,模板选择类库,指定名称,这里命名为
5、Components(组件之意)完成后点确定。Visual Studio 会自动创建一个项目并且包含一个 Class1.cs 的文件,对这个文件单击右键将其重命名为 MyUtils.cs,并且在此文件中的 MyUtils 类中键入下面的代码:/ / 返回字符串真实长度, 1个汉字长度为2/ / 字符长度public static int GetStringLength(string str)return Encoding.Default.GetBytes(str).Length;此主题如下:(注意:示例源代码中包含了数十个有用的方法,简繁体转换,比较时间差等等,本教程重点在教授如何在 Site
6、Factory 标签解析引擎中使用外部组件,而非教授大家如何去编写 C#代码。 )(二) 编译组件,并将组件复制到 SiteFactory 站点根目录下的 bin 文件夹中(三) 配置站点根目录下 Config 文件夹中的 ConsumerExtensionObject.config 文件。打开此文件后会发现这就是一个 xml 文件,结构良好并且严谨。下面是对属性的释义:1. 标签对:为注册一个外部程序集所必要的配置节2. Assembly 程序集:此为组件的名称,比如范例中编译完成的Components.dll3. className 类名:只有通过类名才能反射到类中所包含的方法4. xml
7、ns 命名空间:浅显的可理解为名字空间就是给文档做一个标记按照上文罗列的释义,配置适应刚才编译的 Components.dll 文件,配置代码如下:(四) 配置标签模板随意新建立一个标签,类型选择简单 XSLT 解析,不需要任何参数,下一步到标签内容编辑面板,在 XSLT 样式表的头部注册第三部我们配置的命名空间。如下所示:正如 ConsumerExtensionObject 配置文件中的一样,xmlns 命名空间的名称可以任意指定,但是其值一定要与 ConsumerExtensionObject 配置中 xmlns 的的值匹配。(五) 使用组件中的方法在模板的模板主体部位调用方法,如下面的示
8、例:上面的代码将会返回数字 10,也就是字符的长度。上面的代码会返回 賣身不賣藝(转为繁体)上面的代码会返回 http:/ Components 组件提供的方法,这些方法是系统默认没有提供的,通过这些能够充分体现 SiteFactory Xpower 标签解析引擎支持外部组件的美丽体验using System;using System.IO;using System.Net;using System.Security.Cryptography;using System.Text;using System.Text.RegularExpressions;using Microsoft.Visua
9、lBasic;namespace Componentspublic class MyUtils/ / 返回字符串真实长度, 1个汉字长度为2/ / 字符长度public static int GetStringLength(string str)return Encoding.Default.GetBytes(str).Length;/ / 从字符串的指定位置截取指定长度的子字符串/ / 原字符串/ 子字符串的起始位置/ 子字符串的长度/ 子字符串public static string CutString(string str, int startIndex, int length)if (
10、startIndex = 0)if (length str.Length)return “;elseif (length 0)length = length + startIndex;startIndex = 0;elsereturn “;if (str.Length - startIndex / 从字符串的指定位置开始截取到字符串结尾的了符串/ / 原字符串/ 子字符串的起始位置/ 子字符串public static string CutString(string str, int startIndex)return CutString(str, startIndex, str.Length
11、);/ / MD5函数/ / 原始字符串/ MD5结果public static string MD5(string str)byte b = Encoding.Default.GetBytes(str);b = new MD5CryptoServiceProvider().ComputeHash(b);string ret = “;for (int i = 0; i / 字符串如果操过指定长度则将超出的部分用指定字符串代替/ / 要检查的字符串/ 指定长度/ 用于替换的字符串/ 截取后的字符串public static string GetSubString(string p_SrcStri
12、ng, int p_Length, string p_TailString)return GetSubString(p_SrcString, 0, p_Length, p_TailString);/ / 取指定长度的字符串/ / 要检查的字符串/ 起始位置/ 指定长度/ 用于替换的字符串/ 截取后的字符串public static string GetSubString(string p_SrcString, int p_StartIndex, int p_Length, string p_TailString)string myResult = p_SrcString;Byte bComme
13、nts = Encoding.UTF8.GetBytes(p_SrcString);foreach (char c in Encoding.UTF8.GetChars(bComments)/当是日文或韩文时 (注:中文的范围:u4e00 - u9fa5, 日文在u0800 - u4e00, 韩文为xAC00-xD7A3)if (c u0800 if (p_Length = 0)byte bsSrcString = Encoding.Default.GetBytes(p_SrcString);/当字符串长度大于起始位置if (bsSrcString.Length p_StartIndex)int
14、 p_EndIndex = bsSrcString.Length;/当要截取的长度在字符串的有效长度范围内if (bsSrcString.Length (p_StartIndex + p_Length)p_EndIndex = p_Length + p_StartIndex;else/当不在有效范围内时 ,只取到字符串的结尾p_Length = bsSrcString.Length - p_StartIndex;p_TailString = “;int nRealLength = p_Length;var anResultFlag = new intp_Length;int nFlag = 0
15、;for (int i = p_StartIndex; i 127)nFlag+;if (nFlag = 3)nFlag = 1;elsenFlag = 0;anResultFlagi = nFlag;if (bsSrcStringp_EndIndex - 1 127) var bsResult = new bytenRealLength;Array.Copy(bsSrcString, p_StartIndex, bsResult, 0, nRealLength);myResult = Encoding.Default.GetString(bsResult);myResult = myResu
16、lt + p_TailString;return myResult;/ / 自定义的替换字符串函数/ public static string ReplaceString(string SourceString, string SearchString, string ReplaceString,bool IsCaseInsensetive)return Regex.Replace(SourceString, Regex.Escape(SearchString), ReplaceString,IsCaseInsensetive ? RegexOptions.IgnoreCase : Regex
17、Options.None);/ / 生成指定数量的html 空格符号/ public static string GetSpacesString(int spacesCount)var sb = new StringBuilder();for (int i = 0; i / 返回URL 中结尾的文件名/ public static string GetFilename(string url)if (url = null)return “;string strs1 = url.Split(new /);return strs1strs1.Length - 1.Split(new ?)0;/ /
18、转换为简体中文/ public static string ToSChinese(string str)return Strings.StrConv(str, VbStrConv.SimplifiedChinese, 0);/ / 转换为繁体中文/ public static string ToTChinese(string str)return Strings.StrConv(str, VbStrConv.TraditionalChinese, 0);/ / 返回相差的秒数/ / / / public static int StrDateDiffSeconds(string Time, in
19、t Sec)TimeSpan ts = DateTime.Now - DateTime.Parse(Time).AddSeconds(Sec);if (ts.TotalSeconds int.MaxValue)return int.MaxValue;if (ts.TotalSeconds / 返回相差的分钟数/ / / / public static int StrDateDiffMinutes(string time, int minutes)if (string.IsNullOrEmpty(time)return 1;TimeSpan ts = DateTime.Now - DateTim
20、e.Parse(time).AddMinutes(minutes);if (ts.TotalMinutes int.MaxValue)return int.MaxValue;if (ts.TotalMinutes / 返回相差的小时数/ / / / public static int StrDateDiffHours(string time, int hours)if (string.IsNullOrEmpty(time)return 1;TimeSpan ts = DateTime.Now - DateTime.Parse(time).AddHours(hours);if (ts.Total
21、Hours int.MaxValue)return int.MaxValue;if (ts.TotalHours / 删除最后一个字符/ / / public static string ClearLastChar(string str)return str = “ ? “ : str.Substring(0, str.Length - 1);/ / 根据Url 获得源文件内容/ / 合法的Url 地址/ public static string GetSourceTextByUrl(string url)WebRequest request = WebRequest.Create(url);request.Timeout = 20000; /20秒超时WebResponse response = request.GetResponse();Stream resStream = response.GetResponseStream();var sr = new StreamReader(resStream);return sr.ReadToEnd();下面是示例代码的源文件:在使用这些代码之前,需要解压缩下载文件