XML格式化输出到文件

来源:互联网 发布:app软件如何制作 编辑:程序博客网 时间:2024/05/17 05:12

XML格式化输出到文件

    最近公司有个项目:是用xml来存储配置信息的,在系统启动时,加载配置xml配置,系统运行结束后
将配置信息保存回xml文件(运行过程中,某些信息被修改了)。

    关于xml数据的读取以及解析,由于java自带的类库中,提供了强大的API,我轻松的就实现了这部份功能:

 

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document d 
= builder.parse(new File(filename));

 

但是当要将Document写回到文件时,问题来了,起初我使用以下方法来将数据写回到文件:

 

DOMSource src = new DOMSource(d);
StreamResult result 
= new StreamResult(new File(filename));
Transformer t 
= TransformerFactory.newInstance().newTransformer();
t.transform(src, result);

 

    但是当我打开覆写后的xml文件,发现所有的信息都写在一行里了,好像是一个长长的字符串。
我想,这样不行了,这样子怎么进行人工维护啊,如果每次人工维护时,都要先手动将xml文件
换行,排版成像IE输出的那样子,那非得累死不可。于是,就开始上网找,想找个现成的,
google,baidu,csdn,可半天下来,一无所获。

    得!还是得自已动手。哈哈,半个小时后事情搞定了。

原码如下:(我的xml文件里没有Node Value,所以这里没有这部份内容)

 

static int len = -4;

 

 

public  void write(Document d, String fileName) throws IOException
 
{
  ByteArrayOutputStream buffer 
= new ByteArrayOutputStream();
  
//写入xml头
  buffer.write("<?xml version="1.0" encoding="UTF-8" ?> ".getBytes());

  Element e 
= d.getDocumentElement();

  writeNode(e,buffer);  
//写入xml节点
    
  
//从缓冲到文件
     FileOutputStream out = new FileOutputStream(new File(fileName));
     buffer.writeTo(
out);
     buffer.flush(); 
 }


以下是 writeNode()方法:

public void writeNode(Element e, OutputStream buffer) throws IOException
 
{
  StringBuffer outStr 
= new StringBuffer();
  len 
+=4//Element前先输出len个空格,排版
  for(int i = 0; i < len; i++ )
  
{
   outStr.append(
" ");
  }

  outStr.append(
"<");
  outStr.append(e.getNodeName()
+" ");
  

  
//写入元素属性 name="value"
  NamedNodeMap map = e.getAttributes();
  
for (int j = 0; j < map.getLength(); j++
  
{
   Attr at 
= (Attr) map.item(j);
   outStr.append(at.getName() 
+ "="" + at.getValue()+""");
   outStr.append(
" ");
  }

  
//写入子节点
  if(e.hasChildNodes())
  
{
   outStr.append(
"> ");
   buffer.write(outStr.toString().getBytes());
   NodeList l 
= e.getChildNodes();
   
for (int i = 0; i < l.getLength(); i++
   
{
    
if (l.item(i).getNodeType() == Node.ELEMENT_NODE) 
    
{
      Element ele 
= (Element) l.item(i);
      writeNode(ele, buffer); 
//小小的使用了递归技术
    }

         }

         outStr 
= new StringBuffer();
         
for(int i = 0; i < len; i++ )
   
{
    outStr.append(
" ");
   }

   outStr.append(
"</"+e.getNodeName()+"> ");
   buffer.write(outStr.toString().getBytes());
  }

  
else
  
{
   
//是叶子节点
   outStr.append("/> ");
   buffer.write(outStr.toString().getBytes());
  }

  len 
-=4;
 }
 

 

-----------------------------------------------------------------------------------------------------------------

http://shop33871860.taobao.com/   

QQ: 780023319

旺旺: xichu_coa

原创粉丝点击