<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    在使用dom4j的時候發現有時會出現這樣一個問題:無法以UTF-8編碼格式成功保存xml文件
    錯誤信息:
    Invalid byte 1 of 1-byte UTF-8 sequence. Nested exception: Invalid byte 1 of 1-byte UTF-8 sequence.
    。。。
    代碼:
    private void saveDocumentToFile() {
            
    try {
                OutputFormat format 
    = OutputFormat.createPrettyPrint();
                format.setEncoding(
    "UTF-8");
                XMLWriter writer 
    = new XMLWriter(new FileWriter(xmlFile), format);

                writer.write(document);
                writer.close();
            } 
    catch (Exception ex) {
                ex.printStackTrace();
            }
        }

    錯誤原因:
    在上面的代碼中輸出使用的是FileWriter對象進行文件的寫入。這就是不能正確進行文件編碼的原因所在,Java中由Writer類繼承下來的子類沒有提供編碼格式處理,所以dom4j也就無法對輸出的文件進行正確的格式處理。這時候所保存的文件會以系統的默認編碼對文件進行保存,在中文版的windowJava的默認的編碼為GBK,也就是說雖然我們標識了要將xml保存為utf-8格式,但實際上文件是以GBK格式來保存的,所以這也就是為什么我們使用GBKGB2312編碼來生成xml文件能正確的被解析,而以UTF-8格式生成的文件不能被xml解析器所解析的原因。

    dom4j的編碼處理:
    public XMLWriter(OutputStream out) throws UnsupportedEncodingException {

        
    //System.out.println("In OutputStream");

        
    this.format = DEFAULT_FORMAT;

        
    this.writer = createWriter(out, format.getEncoding());

        
    this.autoFlush = true;

       namespaceStack.push(Namespace.NO_NAMESPACE);

    }

    public XMLWriter(OutputStream out, OutputFormat format) throws UnsupportedEncodingException {

        
    //System.out.println("In OutputStream,OutputFormat");

        
    this.format = format;

        
    this.writer = createWriter(out, format.getEncoding());

        
    this.autoFlush = true;

       namespaceStack.push(Namespace.NO_NAMESPACE);

    }

    /**

    * Get an OutputStreamWriter, use preferred encoding.

    */

    protected Writer createWriter(OutputStream outStream, String

        encoding) 
    throws UnsupportedEncodingException {

        
    return new BufferedWriter(

            
    new OutputStreamWriter( outStream, encoding )

        );

    }

    so :
    dom4j對編碼并沒有進行什么很復雜的處理,完全通過 Java本身的功能來完成。所以我們在使用dom4j生成xml文件時不應該直接在構建XMLWriter時,為其賦一個Writer對象,而應該通過一個OutputStream的子類對象來構建。也就是說在我們上面的代碼中,不應該用FileWriter對象來構建xml文檔,而應該使用 FileOutputStream對象來構建

    修改代碼:
    private void saveDocumentToFile() {
            
    try {
                OutputFormat format 
    = OutputFormat.createPrettyPrint();
                format.setEncoding(
    "UTF-8");
                XMLWriter writer 
    = new XMLWriter(new FileOutputStream(xmlFile), format);

                writer.write(document);
                writer.close();
            } 
    catch (Exception ex) {
                ex.printStackTrace();
            }
        }











    posted on 2010-11-05 11:24 Ying-er 閱讀(239) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 中文字幕的电影免费网站| 亚洲免费在线视频播放| 国产成人高清亚洲一区91| 美女裸身网站免费看免费网站| 亚洲天天做日日做天天欢毛片| 很黄很污的网站免费| 亚洲深深色噜噜狠狠爱网站| 国产精品免费久久久久电影网| 久久久久亚洲AV无码专区桃色| 亚洲五月午夜免费在线视频| 亚洲一区二区三区香蕉| 日本免费污片中国特一级| 久久亚洲精品成人无码网站| 鲁大师在线影院免费观看| 亚洲国产精品成人精品软件 | 免费网站观看WWW在线观看| AV在线亚洲男人的天堂| 91视频免费网站| 亚洲综合无码一区二区| 30岁的女人韩剧免费观看| 亚洲永久网址在线观看| 国产精品免费_区二区三区观看 | 亚洲日韩精品国产一区二区三区| 啦啦啦www免费视频| 午夜免费国产体验区免费的 | 亚洲精品亚洲人成在线观看麻豆| 国产成人免费网站| 无码天堂va亚洲va在线va| 亚洲伊人久久综合影院| 久久精品国产大片免费观看| 亚洲综合久久一本伊伊区| 亚洲AV蜜桃永久无码精品| 久久成人免费电影| 亚洲啪AV永久无码精品放毛片| 亚洲精品乱码久久久久久蜜桃 | 57pao一国产成永久免费 | 一区二区三区免费视频观看| 亚洲va久久久噜噜噜久久男同| 麻豆最新国产剧情AV原创免费| 免费在线人人电影网| 亚洲国产美国国产综合一区二区 |