当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>JAVA网络编程

Java 与 XML 结合使用的心得体会(三)


  XMLBuilder.class 主要是把指定的document.node对象转换成规范的xml字符串。用的是ibm的xml4j解析器.代码如下:
  
  package com.ceic.workflow.xml;
  import java.io.OutputStreamWriter;
  import java.io.PrintWriter;
  import java.io.UnsupportedEncodingException;
  import org.w3c.dom.Attr;
  import org.w3c.dom.document.
  import org.w3c.dom.Element;
  import org.w3c.dom.NamedNodeMap;
  import org.w3c.dom.Node;
  import org.w3c.dom.NodeList;
  import com.ibm.xml.parsers.*;
  
  /**
   * Title:    有效XML 字符串生成工具
   * Description: 有效XML 字符串生成工具
   * Copyright:  Copyright (c) 2003
   * Company:   国电信息中心
   * @author 张治中
   * @version 1.0
   * 有效XML 字符串生成工具
   * 例如:
   * XmlBuilder build=new XmlBuilder();
   * document.nbspdoc=((document.Class.forName("com.ibm.xml.
   * dom.document.mpl").newInstance())
   * ..........
   * build.printDOMTree(doc);
   * String xmlString=build.getXmlResult();
   * 再把xmlString用XmlOutput类去输出成xml文件.
   */
  public class XmlBuilder
  {
  private String lineSeparator="\r";
  private String xmlString="";
  private int indentLevel=0;
  protected static String STANDARD_INDENT=" ";
  private String XmlHeader="<?xml version=\"1.0\" ?>";
  private int currentlevel=0;
   /**
    * 生成XML字符串.
    * @param node 要生成字符串的document.其它Node.
    */
   public void printDOMTree(Node node){
   printDOMTree(node,indentLevel,false);
   }
  
   /**
    * 生成XML字符串.
    * @param node 要生成字符串的document.其它Node.
    * @param noTop 是否去除头尾,如果为document.象去掉<?xml.../?>头
    */
   public void printDOMTree(Node node,boolean noTop){
      printDOMTree(node,indentLevel,noTop);
   }
   /**
    * 生成XML字符串.
    * @param node 要生成字符串的document.其它Node.
    * @param level 节点的深度.(中间变量)
    * @param noTop 是否去除头尾,如果为document.象去掉<?xml.../?>头
    */
   private void printDOMTree(Node node,int level,boolean noTop)
   {
    int templevel=level;
    int find=0;
    short toptype=0;
    String topvalue="";
    int type = node.getNodeType();
    switch (type)
    {
     // print the document.nbspelement
     case Node.document.NODE:
     {
      find++;
      if(!noTop||find>1){
      xmlString+=XmlHeader+lineSeparator;
      }else{
       toptype=Node.document.NODE;
      }
      printDOMTree(((document.node).getdocument.lement(),
   templevel+1,false);
      break;
     }
  
     // print element with attributes
     case Node.ELEMENT_NODE:
     { find++;
  
     if(!noTop||find>1){
      currentlevel=templevel;
      xmlString+=printIndent(templevel);
      xmlString+=lineSeparator+"<";
      xmlString+=node.getNodeName();
      NamedNodeMap attrs = node.getAttributes();
      for (int i = 0; i < attrs.getLength(); i++)
      {
       Node attr = attrs.item(i);
       xmlString+=" " + attr.getNodeName() +"=\"" +
    attr.getNodevalue() +"\"";
      }
      xmlString+=">"+lineSeparator;
     }
     else{
      toptype=Node.ELEMENT_NODE
      topvalue="</"+node.getNodeName()+">"+lineSeparator;
      }
      NodeList children = node.getChildNodes();
      if (children != null)
     {
       int len = children.getLength();
       for (int i = 0; i < len; i++)
        printDOMTree(children.item(i),templevel+1,false);
     }
  
      break;
     }
  
     // handle entity reference nodes
     case Node.ENTITY_REFERENCE_NODE:
     {
      find++;
      xmlString+="&";
      xmlString+=node.getNodeName();
      xmlString+=";";
      break;
     }
  
     // print cdata sections
     case Node.CDATA_SECTION_NODE:
     {
      find++;
      xmlString+="<![CDATA[";
      xmlString+=node.getNodevalue();
      xmlString+="]]>";
      break;
     }
  
     // print text
     case Node.TEXT_NODE:
     {
       find++;
  //    String temp=node.getNodevalue();
  //    if(!temp.equals(" ")&&!temp.equals("\n")
  //     &&!temp.equals("\r"))
       xmlString+=node.getNodevalue();
      break;
     }
  
     // print processing instruction
     case Node.PROCESSING_INSTRUCTION_NODE:
     {
      find++;
      xmlString+="<?";
      xmlString+=node.getNodeName();
      String data = node.getNodevalue();
      {
       xmlString+=" ";
       xmlString+=data;
      }
      xmlString+="?>";
      break;
     }
    }
  
    if (type == Node.ELEMENT_NODE)
    {
     find++;
     if(currentlevel!=templevel){
       xmlString+=printIndent(templevel);
       xmlString+=lineSeparator;
     }
     xmlString+="</";
     xmlString+=node.getNodeName();
     xmlString+=">"+lineSeparator;
    }
    if(noTop&&toptype==Node.ELEMENT_NODE){
     int len=xmlString.length()
     int tlen=topvalue.length()
     xmlString=xmlString.substring(0,len-tlen);
    }
   }
  /**
  * 生成行前的STANDARD_INDENT(一般指空格)
  * @param num STANDARD_INDENT的个数
  * @return String
  */
  private String printIndent(int num){
   String temp="";
   if(num>0){
   for(int i=0;i<num;i++){
    temp+=STANDARD_INDENT;
   }
   }
   return temp;
  }
  /**
  * 设定行前的STANDARD_INDENT(一般指空格)
  * @param indent STANDARD_INDENT的值
  */
  public void setIndent(String indent){
   STANDARD_INDENT=indent;
  }
  /**
  * 获得已经生成的xml字符串.在printDOMTree(Node node)方法后有效
  * @return String
  */
  public String getXmlResult(){
   return xmlString;
  }
  /**
  * 设定最开始的深度级别(直接影响行前的STANDARD_INDENT(空格)数)
  * @param level 级别数
  */
  public void setBeginLevel(int level){
   indentLevel=level;
  }
  /**
  * 设定xml文件的xml头
  * @param header xml文件xml头。例如:<?xml version=\"1.0\" ?>
  */
  public void setXmlHeader(String header){
   XmlHeader=header;
  }
  /**
  * 设定换行符 默认为"\r\n"
  * @param lineseparator 换行分割符,默认为"\r\n"
  */
  public void setlineSeparator(String lineseparator){
   lineSeparator=lineseparator;
  }
  }
  
  
  
    XMLOutput.class 功能是用指定的string或InputStream生成文件(不一定是xml文件)。代码如下:
  
  package com.ceic.workflow.xml
  import org.w3c.dom.*;
  import java.io.*;
  import java.util.*;
  /**
   * Title:    有效XML 字符串生成xml文件的工具
   * Description: 有效XML 字符串生成xml文件的工具
   * Copyright:  Copyright (c) 2003
   * Company:   国电信息中心
   * @author 张治中
   * @version 1.0
   */
  public class XmlOutput{
  private String objectpath;
  pri
相关内容
赞助商链接