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
最近公司有个项目:是用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
相关文章推荐
- 用VBA读取Excel表格输出到格式化的xml文件中
- dom4j输出格式化的xml文件
- 使用SAX读取XML文件的练习--(将读取的XML文件原样输出)
- C# XML文件格式化、xml文件读写(通过自定义类xmlNode实现对xml的操作)
- VBA 格式化输出XML(UTF-8无BOM编码)
- 十九、将文件的输出格式化为指定的宽度:
- dom4j读取一个xml文件,以原格式输出
- 将html代码保存到xml文件中并用xsl转换输出到网页中的方法
- xml文件格式化
- Android项目打包成APK文件,,以及,,Android项目中XML文件格式化配置
- asp输出xml格式文件时的一个诡异错误及解决方法:XML declaration allowed only at the start of the document
- Android数据存储之DOM解析XML文件(输出部分)
- logback.xml配置如何按天输出日志文件
- OpenCV实践(7)- XML和YAML文件的输入输出
- MySQL导入TxT数据文件和格式化输出
- JavaScript实现读取与输出XML文件数据的方法示例
- 利用jdom解析xml配置文件,并且按照xml格式输出,进行缩进
- XML输出中文时,无法用xsl查看(XML文件不能正常显示、中文显示乱码)
- MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql
- log4j.xml文件输出到web工程相对路径的log目录