用XML将机器内码转换为人们容易理解的信息
所属分类:
网页制作 / XML/XSLT
阅读数:
829
收藏 0赞 0分享
程序中通常会有一些错误代码或标识,为了程序中方便这些东西通常不会使用汉字,经常在程序中用的是一些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="<spanclass='red'>您剩余的空间不足,请您删除部分文件。</span><br/>"/>
<addkey="yue"value="<spanclass='red'>您的余额不足,请尽快充值。</span><br/>"/>
</description>
</translation>
在XML模式中扩展枚举列表
在列表中添加新值是一种常见而且必要的需求。模式设计者通常希望在系统架构中构建一种添加附加值的方法,并且该附加值在设计阶段是未知的。模式设计者如何创建一个可扩展、易于实现的枚举值列表?本文将介绍几种实现这一目标的方法。
模式设计者和实现人员需要一种扩
收藏 0赞 0分享
XML入门教程:XML名称空间-XML/XSLT
XML名称空间表示XML名称的使用范围,因为XML可自定义元素标签,所以有不同XML应用间XML名称重名的机会是很大的。如果没有一种方法来区分不应用的名称,就会造成混乱。XML名称空间就是为了解决这个问题而设计的。通过XML名称空间,我们可以区分
收藏 0赞 0分享
XML入门教程:属性声明-XML/XSLT
一个有效的XML文档,必须对元素的属性进行声明。使用ATTLIST声明来完成,一个ATTLIST可以为一个元素类型声明多个属性。
一个有效的XML文档,必须对元素的属性进行声明。使用ATTLIST声明来完成,一个ATTLIST可以为一个元素类型
收藏 0赞 0分享
XML入门教程:实体-XML/XSLT
由于数据不是XML格式,所以使用NDATA声明指定数据类型。avi是在NOTATION中定义的MIME媒体类型。在XML中嵌入未析实体很复杂且不规范,尽量不要使用。
实体
用ENTITY声明定义实体。如:
收藏 0赞 0分享
XML入门教程:元素声明-XML/XSLT
有效文档中使用的每个元素都必须在文档的DTD中用元素声明进行声明。element_name可是任何合法的XML名称,content_model(内容模型)指定元素可以或必须包含的子元素以及子元素的顺序。下面具体介绍内容模型的内容。
上节文档类型
收藏 0赞 0分享
XML入门教程:文档类型声明-XML/XSLT
要使用DTD进行有效性检验,就要使用文档类型定义声明指定DTD。文档类型声明位于XML声明之后,根元素之前。如果dtd文档位于本机,可用路径名直接指出dtd文档的位置。
由于XML可自定义标签,所以每个人定义的标签集都会不同,如
收藏 0赞 0分享
XML入门教程:XML语法-XML/XSLT
接着在浏览器中打开index.xml文档,则可显示“Hello World”。上面两个文档都是合法的XML文件,具体的语法规则下面会详细介绍,上例可先给大家一个感性的认识。合法的XML文档可有种意思,一个是良构文档(well-format),即符合XML规则书写的文档
收藏 0赞 0分享
xml入门教程:XML是什么-XML/XSLT
XML(eXtensible Markup Language,可扩展标记语言)是SGML的一个子集,但比SGML简单,用以创建可相互转换的结构化文本文档和数据文档。下面说明一下与XML相关的一些概念。
XML(eXtensible Markup L
收藏 0赞 0分享
WAP教程(11):WAP论坛和开放移动联盟与论坛-XML/XSLT
WAP 论坛,WAP开放移动联盟,WAP论坛.
WAP 论坛 (WAP Forum)
无线应用协议 (WAP) 论坛为数字移动电话和其他无线终端开发了事实上的全球标准。 WAP 论坛发布了开放的全球无线协议规范,此规范基于已有的因特网标准
收藏 0赞 0分享
查看更多