返回首頁
當前位置: 優度網 > 文案策劃 >

java解析xml實現對象化的字符集錯誤

時間:2014-12-08 11:35來源:未知
  
xml亂碼不會是讀數據庫的原因。因為數據庫直接打出來是正確顯示的中文。但是這里因為經過瀏覽器的轉換,不太清楚瀏覽器是否接受到的utf還是gbk,看不出來。java的XML解釋器直接處理文本,如果不是剛好的那一種文體,解釋和重新生成xml都會出錯。所以需要做一個測試程序。
 
當初在設計該系統時,引入了java和xml的對象綁定的概念,而沒有使用sql生成后輸出表格的做法。主要原因是數據結構復雜后,多重關聯的sql只適合使用在查詢量較少的內部網站如Arp2之類的系統,采用對象化綁定的做法可以簡化查詢。道理是數據庫直接存儲的就是xml,xml本身就是對象化結構,所以可以直接通過程序,轉化為java的對象;在處理完畢后,再自動存回數據庫。這樣調用時,只要給一個ID,類文件就可以按照提取的數據初始化為一個對象。
 
其實就是J2EE的概念。J2EE有現成的,但總是不太成熟的應用產品可賣,只不過價格昂貴,而我們能夠用得上的功能又叫是一小部分,而且似乎自已實現也不太困難。所以我就自已編了這個系統出來,用的時侯還挺好用。只不過在開始布置時,就會碰到這樣那樣的問題。degbug清光后,就順了。這里應該已經完全degbug過的,但在系統災難后,不知怎的又出錯的,有可能是某人某年某月動過了這個備份版本中的某些東西,有了bug,只能一點點地查找。
 
系統在jakarta中,通過引入現成的structs,提供了自已定造tag的功能。這個tag比以前的serverlt有改進,提供了聯結jsp和bean的工具,而且調用上與一般的html:tag沒有什么區別。所以jsp也簡化了。數據庫對象實例化,通過一個實體bean,從request中取得了id,實例化成java對象,然后放在對話上下文中。中間經過了兩個過程,第一個是從數據加得到的一個不帶XML解釋的對象DAO,與j2ee的bean一樣。然后按默認的xml字段提取其中的xml字段,通過一個合并了數據庫讀取的DAO接中的虛擬類,使用apache.Digester digester    =    ((XPROCESSOR)(clazz.newInstance())).getDigester(this);得到了對xml的解釋,然后將它填充到一個與之字段相同的xmlobject類中。數據庫字段與entytie字段需要一模一樣;還有xml類,則通過一個自動編寫代碼的程序,讀取用xml描述的結構字段,自動生成。每次修改后就自動生成一次。
 
檢查虛擬類(xml對象實體類,全部繼承這個類的方法,這樣就只需要編寫一次);
在從xml字符串解析出對象的方法中:
//由xml字段轉為內部集合對象                
public void doSychronize() throws Exception{
System.out.println("doSynchroize here ");
    String name    ="xml";
    String value    =(String)BeanUtilities.invokeGetter(this,name,getClass(),true);
    value    =Utilities.chknull(value);
    if(value!=null){
        String sxpro    =null;
try{
        if(this.entity==null) throw new Exception("entity為空,不能同步XML屬性");
        sxpro    =entity.getCls().getXpro();        
        Class clazz    =Class.forName(sxpro);
        Digester digester    =    ((XPROCESSOR)(clazz.newInstance())).getDigester(this);
        //準備解釋的xml文本;
        byte[] bts    =value.getBytes("gbk");
        ByteArrayInputStream stream    =new ByteArrayInputStream(bts);
        digester.parse((InputStream)stream);
    }catch(Exception ex){
            String msg    ="in the VEntity.doSynchronize,——>sxpro:="+sxpro+";entity:="+entity+";msg:="+ex.getMessage();
            logger.error(msg,getClass());
            throw new Exception(msg);
            }
        }
    }    
 
將        byte[] bts    =value.getBytes("");默認取得的符串,改用        byte[] bts    =value.getBytes("gbk"),暫時解決了問題。
這也證實從數據加讀出來的是gbk字符集的串,所以就更難理解,為什么當時的連接字段是setUnicode=true&defaultset=utf-8
 
另一個現實的問題是,除非此后曾經作過類似的修改,總之,為什么先前的庫讀取(肯定也是gbk),解析就沒有事?中間環節太多,一時想不通,暫時也不重要,到處理完眼前的恢復,再細細回味。
------分隔線----------------------------
推薦內容
? 澳洲幸运8开奖号码查询