java生成xml文件的时候如何控制xml的缩进格式
使用java自带的xml api生成的xml文件,其格式都是没有缩进的,每个element都是顶到最前面,今天终于到了比较好的处理方法,赶紧记下来.
使用Java标准的JAXP来输出可以使用:
Transformer transformer = wInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
ansform(new DOMSource(document), new StreamResult(outputFile));
中间的红代码是用于设置缩进的,比较遗憾的是JAXP只抽象出是否设置缩进(indent: yes|no),但并没有抽象出设置缩进量长度的常量(indent-number),所以默认的缩进量长度为0。如果有下面这样一个xml文档:<root><a><b>c</b></a></root>会被格式化为:
<root>
<a>
<b>c</b>
</a>
</root>
由于JAXP只是一个Java一个处理XML的框架,根据实现的不一样,可以传入实现特定的某个Key来设置缩进量。比如在Java 1.4下面,可以通过下面语句将缩进量设为2:
ransformer.setOutputProperty(
"{/xslt}indent-amount", "2");
transformer.setOutputProperty(
 "{/xalan}indent-amount", "2");
上面两句不同之处仅在于命名空间。
而在Java 1.5下面,情况就有些复杂了。Java 1.5集成了JXAP 1.3(Java 1.4集成的是JXAP 1.1,不同之处参见java.sun/j2se/1.5.0/docs/guide/xml/jaxp/JAXP-Compatibility_150.html),实现基于Xerces类库。由于内部实现上的Bug,导致了设置缩进的不同:
TransformerFactory tf = wInstance();
tf.setAttribute("indent-number", new Integer(2));
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
ansform(new DOMSource(document), new StreamResult(new?BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile)))));
注意红代码的不同之处。第一句设置TransformerFactory的indent-number属性,在Java 1.4下面运行会抛出异常,因为其不支持该属性,而在Java 1.5中却只能通过该属性来设置
缩进。后面标为红的代码则是由于Sun实现上的Bug,只有通过StreamResult(Writer)构造函数生成才能正确设置缩进(通过OutputStream或者File生成的StreamResult是无法设置缩进的,其实现上会忽略任何非正式的属性,而仅仅采用rt.jar下面com\sun\org\apache\xml\internal\serializer\output_xml.properties中的配置。详细可以在l.internal.serializer.ToStream类的setOutputStream方法中加断点进行分析)
如果忽略掉可移植性,确认绑定在Sun的JRE实现上面,则可以通过如下代码来更好的实现:
OutputFormat format = new OutputFormat(document);
format.setIndenting(true);
format.setIndent(2);
Writer output = new BufferedWriter( new FileWriter(outputFile) );
XMLSerializer serializer = new XMLSerializer(output, format);
serializer.serialize(document);
但是OutputFormat类和XMLSerializer类都是位于l.internal.serialize包下。
如果应用对增加一个300K左右的jar包不敏感的话,我还是强烈推荐用dom4j来处理xml,其API设计的非常易用,写出来的代码比用JXAP写出来的代码漂亮多了,也容易维护,也不会出现上面那种两个Java版本不兼容的问题。
import  org.w3c.dom.*;   
  import  l.parsers.*;   
  import  ansform.*;   
  import  ansform.dom.DOMSource;   
  import  ansform.stream.StreamResult;   
  import  java.io.*;   
  public  class  writexml{   
    private  Document  document;   
    private  String  filename;   
   
  public  writexml(String  name)  throws  ParserConfigurationException{   
  filename=name;   
  DocumentBuilderFactory  wInstance();   
  DocumentBuilder  wDocumentBuilder(); 
  wDocument();   
  }   
  public  void  toWrite(String  mytitle,String  mycontent){   
  Element  ateElement("WorkShop");   
  document.appendChild(root);   
  Element  ateElement("Title");   
  title.ateTextNode(mytitle));   
  root.appendChild(title);   
使用dom4j解析xml文件  Element  ateElement("Content");   
  content.ateTextNode(mycontent));   
  root.appendChild(content); 
   
  }   
  public  void  toSave(){   
  try{   
  TransformerFactory  wInstance();   
  Transformer  wTransformer();   
  DOMSource  source=new  DOMSource(document);   
  transformer.setOutputProperty(OutputKeys.ENCODING,"GB2312");   
  transformer.setOutputProperty(OutputKeys.INDENT,"yes");   
  PrintWriter  pw=new  PrintWriter(new  FileOutputStream(filename));   
  StreamResult  result=new  StreamResult(pw);   
  ansform(source,result);   
  }   
  catch(TransformerException  mye){   
  mye.printStackTrace();   
  }   
  catch(IOException  exp){   
  exp.printStackTrace();   
  }   
  }   
  public  static  void  main(String  args[]){   
  try{   
  writexml  myxml=new  writexml("d:\\9.xml");   
  Write("中文题目","中文内容");   
  Save();   
  System.out.print("Your  writing  is  successful!");   
  }   
  catch(ParserConfigurationException  exp){   

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。