使用XML将机器内码转换为人们能够理解的信息案例分享

互联网 17-3-15
  程序中通常会有一些错误代码或标识,为了程序中方便这些东西通常不会使用汉字,经常在程序中用的是一些FileError或数字。还有就是在编码中经常使用的枚举标识对象的状态。而通常这些信息会直接的或间接的现实给用户,可用户需要到的是容易理解的汉字描述。以前要么将这  程序中通常会有一些错误代码或标识,为了程序中方便这些东西通常不会使用汉字,经常在程序中用的是一些FileError或数字。还有就是在编码中经常使用的枚举标识对象的状态。而通常这些信息会直接的或间接的现实给用户,可用户需要到的是容易理解的汉字描述。以前要么将这些标识和枚举的转换规则硬编码到程序中,要么就直接提示给用户。前者没有很好的扩展性,而后者则让用户一头雾水。现可以用流行的XML(配置文件)保存提示信息,然后用一个对象将机器中的内码转换为人们容易理解的信息。  转换对象如下:  
/**////     ///翻译类,将内部码翻译成容易理解的中文     ///     ///     ///根据配置文件中的信息,将系统内部码(错误码、成功码)翻译成中文(或人容易理解的语言)。     ///     publicstaticclassTranslation     ...{     privatestaticSystem.IO.FileSystemWatcherwatcher;     privatestaticXmlDocumentcontent;     privatestaticstringconfigFile;     privatestaticobjectlocker=newobject();          /**////     ///加载配置文件     ///     ///     publicstaticvoidConfigure(stringconfigFile)     ...{     LoadFile(configFile);     if(watcher!=null)     ...{     watcher.Dispose();     }     watcher=newFileSystemWatcher(Path.GetDirectoryName(configFile),Path.GetFileName(configFile));     watcher.Changed =newFileSystemEventHandler(watcher_Changed);     }          /**////     ///加载默认配置文件     ///     publicstaticvoidConfigure()     ...{     if(System.Web.HttpContext.Current!=null)     ...{     Configure(System.Web.HttpContext.Current.Server.MapPath("~/translation.config"));     }     else     ...{     Configure(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase "\" "translation.config");     }     }          /**////     ///加载文件内容     ///     ///     privatestaticvoidLoadFile(stringconfigFile)     ...{     lock(locker)     ...{     XmlDocumentdoc=newXmlDocument();     doc.Load(configFile);          content=doc;     Translation.configFile=configFile;     }     }          /**////     ///当文件变更时,从新加载文件     ///     ///     ///     privatestaticvoidwatcher_Changed(objectsender,FileSystemEventArgse)     ...{     LoadFile(configFile);     }          /**////     ///获取Enum的解释,如果Enum有Flag标记,则使用逗号分隔各个解释     ///     ///     ///     publicstaticstringGetEnumDescription(EnumenumValue)     ...{     returnGetEnumDescription(enumValue,",");     }          /**////     ///获取Enum的解释,如果Enum有Flag标记,则使用sparator分隔各个解释     ///     ///     ///     ///     publicstaticstringGetEnumDescription(EnumenumValue,stringsparator)     ...{     Typetype=enumValue.GetType();          //检查类型是否有Flags特性     object[]attrs=type.GetCustomAttributes(typeof(FlagsAttribute),false);     if(attrs.Length>0)     ...{     StringBuilderbuilder=newStringBuilder();     Arrayarr=Enum.GetValues(type);     foreach(Enumenuinarr)//循环获取每一个值的解释     ...{     if((Convert.ToUInt64(enumValue)&Convert.ToUInt64(enu))==Convert.ToUInt64(enu))//判断是否有这个值     ...{     builder.Append(GetEnumDes(type,enu.ToString()));     builder.Append(sparator);     }     }     if(builder.Length!=0)//拿掉最后的分隔符     builder.Remove(builder.Length-sparator.Length,sparator.Length);     returnbuilder.ToString();     }     else     ...{     returnGetEnumDes(type,enumValue.ToString());     }     }          /**////     ///获取某一Enum类型值的解释     ///     ///     ///     ///     privatestaticstringGetEnumDes(Typetype,stringvalue)     ...{     stringxquery="/translation/enum/" type.FullName "/" value;     XmlNodenode=content.SelectSingleNode(xquery);     if(node!=null)     returnnode.InnerText;     else     returnvalue;     }          /**////     ///翻译指定值     ///     ///     ///     publicstaticstringGetValueDescription(objectobj)     ...{     returnGetValueDescription("default",obj);     }          /**////     ///在指定组中翻译指定值     ///     ///     ///     ///     publicstaticstringGetValueDescription(stringgroup,objectobj)     ...{     if(obj==null)     return"null";          stringxquery="/translation/description[@group='" group "']/add[@key='" obj.ToString() "']/@value";     XmlNodenode=content.SelectSingleNode(xquery);     if(node==null)     returnobj.ToString();     else     returnnode.Value;     }     }                                                              #p#

  在这个对象使用前需要使用Configure方法来加载xml配置文件,默认的配置文件名称为translation.config。转换对象使用单例模式,使用了一个FileSystemWatcher对象来监视XML文件,如果XML有变化,则从新加载。查询XML使用了XPath表达式。  然后即可使用GetEnumDescription和GetValueDescription方法来翻译枚举和标识了。如果没有找到可以翻译的值,则会返回对象的ToString方法的返回值。  示例XML配置:

<?xmlversion="1.0"encoding="utf-8"?>   <translation>   <enum>   <!--此出要用枚举的全名-->   <Library.UserType>   <Unknow>未知</Unknow>   <AfterPayUser>后付费用户</AfterPayUser>   <BeforePayUser>预付费用户</BeforePayUser>   </Library.UserType>   </enum>   <descriptiongroup="default">   <addkey="FileErrorl"value="文件已损坏"/>   </description>   <descriptiongroup="skin">   <addkey="Default"value="默认皮肤"/>   </description>   <descriptiongroup="topic">   <addkey="space"value="&lt;spanclass='red'&gt;您剩余的空间不足,请您删除部分文件。&lt;/span&gt;&lt;br/&gt;"/>   <addkey="yue"value="&lt;spanclass='red'&gt;您的余额不足,请尽快充值。&lt;/span&gt;&lt;br/&gt;"/>   </description>   </translation>

以上就是使用XML将机器内码转换为人们能够理解的信息案例分享的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: xml
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:具体介绍历数Firefox2.0对XML处理的改进的代码实例(图)

相关资讯