Author : zhyiwww
E-Mail : zhyiwww@163.com
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体系和技术的理解。