XML串的格式化输出

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,弄了好一会也没有搞定。

最后我就使用了StringReaderStringWriter实现了xml字符串的格式化。

所以归根结底,我们要说,能否正确和熟练的使用java来实现功能,最终要看你对java体系和技术的理解。

posted on 2007-01-17 15:11  kenty  阅读(464)  评论(0编辑  收藏  举报