华域联盟 XML/XSLT 用XML将机器内码转换为人们容易理解的信息

用XML将机器内码转换为人们容易理解的信息

  程序中通常会有一些错误代码或标识,为了程序中方便这些东西通常不会使用汉字,经常在程序中用的是一些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;

  }

  }
上一页
1
2
下一页
阅读全文

本文由 华域联盟 原创撰写:华域联盟 » 用XML将机器内码转换为人们容易理解的信息

转载请保留出处和原文链接:https://www.cnhackhy.com/138166.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部