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,弄了好一會也沒有搞定。
最後我就使用了StringReader和StringWriter實現了xml字符串的格式化。
所以歸根結底,我們要說,能否正確和熟練的使用java來實現功能,最終要看你對java體系和技術的理解。