以前一直用java,對于xml的處理大多數時候都是直接使用jdk提供的標準dom和sax api,很少會去關心api背后的具體實現,個人而言比較偏愛xerces,時間長了,習以為常,僅此而已。
 
如今用.net,概嘆xml技術的無處不在之外,還要花一點點時間去了解和適應.net framework提供的xml操縱api。.net framework提供的api也無他,無非就是dom和sax,只是在傳統的sax的基礎上有所發展,弄出來一個什么使用“拉”技術的改良sax,嘗試了一下,確實要比傳統的sax要簡單、靈活,不用再繼承某一個稀奇古怪的什么類又實現什么讓人傷腦筋的回調方法,只要弄一個while循環嵌一個switch結構就可以“只關心你所關心的節點類型和節點內容”。和dom對應的類是xmldocument及其派生類,和sax對應的類是xmlreader及其派生類,例如常用的xmltextreader。
 
前兩天做一個小工具,作用是根據xml文件描述來批量生成一些煩冗復雜無聊透頂的c#代碼,以前老師吹噓xml的魔力的時候提到過“...甚至你可以用xml來實現一套你自己的語言...”云云,當時聽著沒當回事,現在想來還真的名不虛傳(btw,其實類似的事情人家xdoclet老早就這么做了)。期間有個小想法,就是把一個雜亂無章的xml文本弄得漂漂亮亮的,再顯示出來看著好舒服點,自然就想到了xml文檔的格式化。
 
在java領域里整理、美化一個xml文檔是一件很easy的事情,有很多開源組件都可以出色地完成這個任務,不過在用.net framework api的時候著實讓我苦惱了一下。當時查了半天的msdn也就僅僅發現xmltextwriter可以實現這個目的而已,而且xmltextwriter還必須將內容輸出到一個物理file或者是一個stream(管你流到哪:),除非你手工拼湊字符串。但是我不想將之輸出到任何內存之外的地方也不想拼湊無聊的字符串,于是又去翻system.io命名空間,搗鼓了半天才發現一個memorystream(java領域好像沒有這種說法?),雖然是孤陋寡聞但是好歹也找對了。擺弄了一下,代碼貼出,誰要參考的拿去吧,有好的批評建議可別吝嗇要向我反饋。
 
private void btnshow_click(object sender, system.eventargs e)
{
   string xmlfile = @"c:/tmp.xml";
   memorystream mstream = new memorystream( 1024 );
   xmltextwriter writer = new xmltextwriter( mstream, null );
   xmldocument xmldoc = new xmldocument();
   writer.formatting = formatting.indented;
   xmldoc.load( xmlfile );
   xmldoc.writeto( writer );
   writer.flush();
   writer.close();
 
   encoding encoding = encoding.getencoding( "utf-8" );
   this.rtxtresult.text = encoding.getstring(mstream.toarray());
   mstream.close();
}
 
注:這僅僅是示例代碼,不適用于工業強度。
 
后記:當時是用richtextbox來顯示xml文本,雖然經過了格式化,但是看起來還是不舒服,后來干脆整了一個webbrowser貼在form上,直接去navigate一個xml物理file,效果就跟用ie打開xml一樣,縮進、高亮、折疊都有了,省心省力。。-_-#
新聞熱點
疑難解答
圖片精選