小編給大家分享一下怎么使用XML將機器內(nèi)碼轉(zhuǎn)換為人們能夠理解的信息,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)專注于興安盟企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城網(wǎng)站制作。興安盟網(wǎng)站建設(shè)公司,為興安盟等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站制作,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
程序中通常會有一些錯誤代碼或標識,為了程序中方便這些東西通常不會使用漢字,經(jīng)常在程序中用的是一些FileError或數(shù)字。還有就是在編碼中經(jīng)常使用的枚舉標識對象的狀態(tài)。而通常這些信息會直接的或間接的現(xiàn)實給用戶,可用戶需要到的是容易理解的漢字描述。
程序中通常會有一些錯誤代碼或標識,為了程序中方便這些東西通常不會使用漢字,經(jīng)常在程序中用的是一些FileError或數(shù)字。還有就是在編碼中經(jīng)常使用的枚舉標識對象的狀態(tài)。而通常這些信息會直接的或間接的現(xiàn)實給用戶,可用戶需要到的是容易理解的漢字描述。以前要么將這些標識和枚舉的轉(zhuǎn)換規(guī)則硬編碼到程序中,要么就直接提示給用戶。前者沒有很好的擴展性,而后者則讓用戶一頭霧水?,F(xiàn)可以用流行的XML(配置文件)保存提示信息,然后用一個對象將機器中的內(nèi)碼轉(zhuǎn)換為人們?nèi)菀桌斫獾男畔ⅰ?br/>轉(zhuǎn)換對象如下:
/**//// ///翻譯類,將內(nèi)部碼翻譯成容易理解的中文 /// /// ///根據(jù)配置文件中的信息,將系統(tǒng)內(nèi)部碼(錯誤碼、成功碼)翻譯成中文(或人容易理解的語言)。 /// 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"); } } /**//// ///加載文件內(nèi)容 /// /// 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)//循環(huán)獲取每一個值的解釋 ...{ 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。轉(zhuǎn)換對象使用單例模式,使用了一個FileSystemWatcher對象來監(jiān)視XML文件,如果XML有變化,則從新加載。查詢XML使用了XPath表達式。
然后即可使用GetEnumDescription和GetValueDescription方法來翻譯枚舉和標識了。如果沒有找到可以翻譯的值,則會返回對象的ToString方法的返回值。
示例XML配置:
未知 后付費用戶 預(yù)付費用戶
以上是“怎么使用XML將機器內(nèi)碼轉(zhuǎn)換為人們能夠理解的信息”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!