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

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

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

    隨筆-26  評(píng)論-13  文章-46  trackbacks-0
    這幾天開始學(xué)習(xí)dom4j,在網(wǎng)上找了篇文章就開干了,上手非常的快,但是發(fā)現(xiàn)了個(gè)問(wèn)題就是無(wú)法以UTF-8保存xml文件,保存后再次讀出的時(shí)候會(huì)報(bào)“Invalid byte 2 of 2-byte UTF-8 sequence.”這樣一個(gè)錯(cuò)誤,檢查發(fā)現(xiàn)由dom4j生成的這個(gè)文件,在使用可正確處理XML編碼的任何的編輯器中中文成亂碼,從記事本查看并不會(huì)出現(xiàn)亂碼會(huì)正確顯示中文。讓我很是頭痛。試著使用GBK、gb2312編碼來(lái)生成的xml文件卻可以正常的被解析。因此懷疑的dom4j沒(méi)有對(duì)utf-8編碼進(jìn)行處理。便開始查看dom4j的原代碼。終于發(fā)現(xiàn)的問(wèn)題所在,是自己程序的問(wèn)題。
    在dom4j的范例和網(wǎng)上流行的《DOM4J 使用簡(jiǎn)介》這篇教程中新建一個(gè)xml文檔的代碼都類似如下

    public void createXML(String fileName) {

    Document doc 
    = org.dom4j.DocumentHelper.createDocument();

    Element root 
    = doc.addElement("book");

    root.addAttribute(
    "name""我的圖書");



    Element childTmp;

    childTmp 
    = root.addElement("price");

    childTmp.setText(
    "21.22");



    Element writer 
    = root.addElement("author");

    writer.setText(
    "李四");

    writer.addAttribute(
    "ID""001");



    try {

    org.dom4j.io.XMLWriter xmlWriter 
    = new org.dom4j.io.XMLWriter(

    new FileWriter(fileName));

    xmlWriter.write(doc);

    xmlWriter.close();

    }


    catch (Exception e) {

    System.
    out.println(e);

    }


    }


    在上面的代碼中輸出使用的是FileWriter對(duì)象進(jìn)行文件的輸出。這就是不能正確進(jìn)行文件編碼的原因所在,java中由Writer類繼承下來(lái)的子類沒(méi)有提供編碼格式處理,所以dom4j也就無(wú)法對(duì)輸出的文件進(jìn)行正確的格式處理。這時(shí)候所保存的文件會(huì)以系統(tǒng)的默認(rèn)編碼對(duì)文件進(jìn)行保存,在中文版的window下java的默認(rèn)的編碼為GBK,也就是所雖然我們標(biāo)識(shí)了要將xml保存為utf-8格式但實(shí)際上文件是以GBK格式來(lái)保存的,所以這也就是為什么能夠我們使用GBK、GB2312編碼來(lái)生成xml文件能正確的被解析,而以UTF-8格式生成的文件不能被xml解析器所解析的原因。
    好了現(xiàn)在我們找到了原因所在了,我們來(lái)找解決辦法吧。首先我們看看dom4j是如何實(shí)現(xiàn)編碼處理的


    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 )

    );

    }


    由上面的代碼我們可以看出dom4j對(duì)編碼并沒(méi)有進(jìn)行什么很復(fù)雜的處理,完全通過(guò)java本身的功能來(lái)完成。所以我們?cè)谑褂胐om4j的來(lái)生成我們的XML文件時(shí)不應(yīng)該直接為在構(gòu)建XMLWriter時(shí),不應(yīng)該直接為其賦一個(gè)Writer對(duì)象,而應(yīng)該通過(guò)一個(gè)OutputStream的子類對(duì)象來(lái)構(gòu)建。也就是說(shuō)在我們上面的代碼中,不應(yīng)該用FileWriter對(duì)象來(lái)構(gòu)建xml文檔,而應(yīng)該使用FileOutputStream對(duì)象來(lái)構(gòu)建所以將代碼修改入下:
    public void createXML(String fileName) {

    Document doc 
    = org.dom4j.DocumentHelper.createDocument();

    Element root 
    = doc.addElement("book");

    root.addAttribute(
    "name""我的圖書");



    Element childTmp;

    childTmp 
    = root.addElement("price");

    childTmp.setText(
    "21.22");



    Element writer 
    = root.addElement("author");

    writer.setText(
    "李四");

    writer.addAttribute(
    "ID""001");



    try {
    //注意這里的修改


    org.dom4j.io.XMLWriter xmlWriter 
    = new org.dom4j.io.XMLWriter(

    new FileOutputStream(fileName));

    xmlWriter.write(doc);

    xmlWriter.close();

    }


    catch (Exception e) {

    System.
    out.println(e);

    }


    }


    至此DOM4J的問(wèn)題編碼問(wèn)題算是告一段落,希望對(duì)此文章對(duì)其他朋友有用。
    posted on 2005-06-23 17:50 似水流年 閱讀(389) 評(píng)論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 久久久无码精品亚洲日韩按摩| 久久九九AV免费精品| 三级黄色片免费看| 亚洲一区二区三区写真| 亚洲国产精品国自产电影| 亚洲精品tv久久久久久久久久| 久久久久久国产精品免费免费| 亚洲人成色777777老人头| 久久精品亚洲一区二区三区浴池| 亚洲精品视频在线观看你懂的| 四虎永久免费影院在线| 大地资源免费更新在线播放| 69免费视频大片| 久久99青青精品免费观看| 两个人的视频www免费| 免费夜色污私人影院网站电影| 亚洲а∨精品天堂在线| 亚洲中文字幕无码一去台湾| 亚洲色大成网站www永久| 亚洲∧v久久久无码精品| 亚洲av永久无码精品网站| 亚洲桃色AV无码| 亚洲日韩av无码| 国产亚洲A∨片在线观看| 久久综合亚洲色HEZYO国产| 亚洲无码黄色网址| 亚洲精品国产自在久久 | 亚洲黄色在线视频| 亚洲伦理一区二区| 噜噜噜亚洲色成人网站∨| 91在线精品亚洲一区二区| 久久狠狠高潮亚洲精品| 亚洲中文字幕久久精品无码2021| 亚洲欧洲日产国码二区首页| 亚洲国产成人九九综合| 亚洲av永久无码精品天堂久久| 国产99在线|亚洲| 亚洲精品蜜夜内射| 野花视频在线官网免费1| 精品免费久久久久国产一区| 日韩av无码免费播放|