您的位置:首页 > 其它

XML格式化输出到文件

2006-07-29 15:36 357 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: