XML串的格式化輸出

 

 

Author     :      zhyiwww

E-Mail      :      [email protected]

Date          :      2007-1-15

轉載請註明出處(copyright by @ zhangyi)

 

 

 

如果我們格式化一個xml文件話,我們可能使用下面的方法:

try{

           SAXReader saxReader = new SAXReader();

              註釋:先讀入一個文件流

           Document doc= saxReader.read(new FileInputStream(new File(filePath)));

         

             註釋:創建輸出格式

          OutputFormat format = OutputFormat.createPrettyPrint();

              註釋:制定輸出xml的編碼類型

           format.setEncoding("GBK");

              註釋:創建一個文件輸出流

           XMLWriter writer= new XMLWriter(new FileWriter(new File(filename)),format);

              註釋:將格式化後的xml串寫入到文件

           writer.write(doc);

           writer.close();     

       }catch(Exception ex){

           ……

       }

 

經過的步驟是:

讀取xml文件,然後再格式化輸出。

那麼,如果我們得到了一個XML的串,當然,是在內存中的,我們有如何返回一個格式化後的串呢?

其實也很簡單,就是先把xml的串讀到一個流中,然後解析,在格式化輸出就可以了。下面就是我的實現;

 

註釋:str是你的參數,也就是在內存中的沒有格式化過的xml

public static String format(String str) throws UnsupportedEncodingException,

      IOException, DocumentException {

    //System.out.println(" str :  " + str);

   

    SAXReader reader=new SAXReader();

    //System.out.println(reader);

    註釋:創建一個串的字符輸入流

    StringReader in=new StringReader(str);

    Document doc=reader.read(in);

   // System.out.println(doc.getRootElement());

    註釋:創建輸出格式

    OutputFormat formater=OutputFormat.createPrettyPrint();

    註釋:設置xml的輸出編碼

formater.setEncoding("utf-8");

    註釋:創建輸出(目標)

    StringWriter out=new StringWriter();

    註釋:創建輸出流

    XMLWriter writer=new XMLWriter(out,formater);

   註釋:輸出格式化的串到目標中,執行後。格式化後的串保存在out中。

writer.write(doc);

   

    //writer.close();

System.out.println(out.toString());

註釋:返回我們格式化後的結果

    return out.toString();      

  }

 

示例:

格式化前的xml串:

 <?xml version="1.0" encoding="utf-8"?><schemes> <scheme> <num>0</num> <line> <lnName>aaaa</lnName> <stops> <stop>  <spName>bbbb</spName>  </stop>

        <stop><spName>ccc</spName> </stop>   <stop> <spName>dddd</spName> </stop> <stop><spName>eee</spName> </stop> <stop><spName>ffff</spName>

        </stop><stop> <spName>eeeee</spName></stop>  </stops></line> <line> <lnName>pppp</lnName> <stops> <stop> <spName>kkkk</spName>  </stop>  <stop>

          <spName>ssss</spName> </stop>  <stop> <spName>eeeeee</spName></stop><stop><spName>ttttt</spName></stop></stops></line>

  </scheme> </schemes>

 

格式化後的xml串如下:

<?xml version="1.0" encoding="utf-8"?>

 

<schemes>

  <scheme>

    <num>0</num>

    <line>

      <lnName>aaaa</lnName>

      <stops>

        <stop>

          <spName>bbbb</spName>

        </stop>

        <stop>

          <spName>ccc</spName>

        </stop>

        <stop>

          <spName>dddd</spName>

        </stop>

        <stop>

          <spName>eee</spName>

        </stop>

        <stop>

          <spName>ffff</spName>

        </stop>

        <stop>

          <spName>eeeee</spName>

        </stop>    

      </stops>

    </line>

    <line>

      <lnName>pppp</lnName>

      <stops>

        <stop>

          <spName>kkkk</spName>

        </stop>

        <stop>

          <spName>ssss</spName>

        </stop>

        <stop>

          <spName>eeeeee</spName>

        </stop>

        <stop>

          <spName>ttttt</spName>

        </stop>

      </stops>

    </line>

  </scheme>

</schemes>

 

問題的關鍵:

其實,從實現的角度來說,我們可以看到,最關鍵的其實是我們對java體系IO的理解和使用。

我在剛開始實現的時候,我用了

 

Format(String  str){

SAXReader saxReader = new SAXReader();             

Document doc= saxReader.read(str);

……

}

 

但是,編譯的時候就拋出了異常。

後來我覺得可能是字符串流沒有緩衝,所以不行。

所以我就使用了

StringBufferInputStream,弄了好一會也沒有搞定。

最後我就使用了StringReaderStringWriter實現了xml字符串的格式化。

所以歸根結底,我們要說,能否正確和熟練的使用java來實現功能,最終要看你對java體系和技術的理解。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章