科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航



ZDNet>软件频道>中间件-zhiding>Java 与 XML 结合使用的心得体会

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

XMLParser.class:xml解析器接口。 XMLParserTest.class:xml解析器接口实现子类。 XMLParserFactory.class :xml解析器工厂类。 XMLTool.class :xml工具类接口(对xml文档进行操作)。 XMLToolTest.class :xml工具类接口实现子类。

来源:中国IT实验室 2007年09月22日

关键字:java XMLBeans


  设计图如下:
  

  XMLParser.class:xml解析器接口。
  
  XMLParserTest.class:xml解析器接口实现子类。
  
  XMLParserFactory.class :xml解析器工厂类。
  
  XMLTool.class :xml工具类接口(对xml文档进行操作)。
  
  XMLToolTest.class :xml工具类接口实现子类。
  
  XMLToolShow.class :{xml工具类接口实现子类(所有方法的实现都是用XMLTool接口的对应方法实现,功能是通过setForm()灵活更换自己的兄弟类(XMLTool)作为 XML处理工具来获得更好的效率和完善。}
  
  XMLToolFactory.class :xml工具类工厂类。
  
  还有两个设计图中没有的class:
  
  XmlBuilder.class :根据指定的document.Node生成规范的xml字符串。
  
  XmlOutput.class :根据指定的xml字符串或InputStream生成指定的xml文件。
  
  我在 XMLParserTest.class用到的是xml4j解析器.代码如下:
  
  package com.ceic.workflow.xml.Parser;
  
  import com.ceic.workflow.xml.XMLParser;
  import com.ibm.xml.parsers.*;
  import java.io.*;
  import org.xml.sax.InputSource;
  /**
   * XML解析器test
   * Title:    XML解析器test
   * Description: XML解析器test
   * Copyright:  Copyright (c) 2003
   * Company:   国电信息中心
   * @author 张治中
   * @version 1.0
   */
  public class XMLParserTest implements XMLParser
  {
  
  public XMLParserTest()
  {
  
  }
  
  /**
  * 解析path位置的xml文件
  * @param path 文件位置
  * @param vali 备用参数
  * @return Object
  * @roseuid 3ECC2FC10043
  */
  public Object parse(String path, boolean vali)
  {
   if(path!=null&&path.length()>0){
   try{
   DOMParser parser = new DOMParser();
   parser.parse(path);
   return parser.getdocument.)
   }catch(Exception e){
     System.out.println("XMLParserTest.parse(\""
    +path+"\","+vali+")出错"+e.getMessage());
    return null;
    }
   }
   return null;
  }
  
  /**
  * 解析xmlString字符串
  * @param xmlString xml字符串
  * @return Object
  * @roseuid 3ECC2FC10043
  */
  
  public Object parseString(String xmlString)
  {
   if(xmlString!=null&&xmlString.length()>0){
   try{
   DOMParser parser = new DOMParser();
   StringReader rd=new StringReader(xmlString);
   InputSource in=new InputSource(rd);
   parser.parse(in);
   return parser.getdocument.)
   }catch(Exception e){
   System.out.println("XMLParserTest.parseString
   (\""+xmlString+"\")出错"+e.getMessage());
   return null;}
   }
   return null;
  }
  }
  
  
  
  XMLParserFactory.class用普通手动注册方式。高手可以指点一下好的解决方法。代码如下:
  
  package com.ceic.workflow.xml;
  
  import com.ceic.workflow.xml.Parser.XMLParserTest;
  import java.util.*;
  /**
   * XML解析器工厂
   */
  public class XMLParserFactory
  {
  private static Hashtable table;
  private static String defaultType;
  
  private XMLParserFactory()
  {
  }
  
  /**
  * 获得XML解析器
  * @param parserType XML解析器类型
  * @param parserClassName XML解析器类名
  * @return com.ceic.workflow.xml.XMLParser
  * @roseuid 3ECB39E30029
  */
  public static XMLParser getXMLParser
  (String parserType, String parserClassName)
  {
   try{
   if(parserType==null||parserType.length() <=0){
    parserType=defaultType;
   }
   if(table.containsKey(parserType)){
    return ((XMLParser)Class.forName(table.
    get(parserType).toString()).newInstance());
   }
   if(parserClassName!=null&&parserClassName.length() >0){
    try{
    XMLParser temp=((XMLParser)Class.
    forName(parserClassName).newInstance());
    if(parserType!=null&&parserType.length() >0){
     table.put(parserType,parserClassName);
    }
    return temp;
    }catch(Exception ee){
     System.out.println(ee.getMessage() );
     System.out.println("指定的XML解析器不存在");
     return null;
    }
   }
   return null;
   }catch(Exception e){
    System.out.println(e.getMessage() );
    System.out.println("指定的XML解析器不存在");
    return null;
   }
  }
  public static String getDefaultType(){
  return defaultType;
  }
  
  static
  {
   table=new Hashtable();
   table.put("dom","com.ceic.workflow.xml.
   Parser.XMLParserTest");
   defaultType="dom";
  }
  }
  
  
  
  其中getXMLParser(String parserType, String parserClassName)如果是调用已知(已注册)XMLParser,第2个参数可以是null或""
  
  接口 XMLTool.class是主要的外界操作界面。代码如下:
  
  package com.ceic.workflow.xml;
  import org.w3c.dom.*;
  
  /**
   * Title:    XML处理工具的 运算和实现部分 的接口
   * Description: XML处理工具的 运算和实现部分 的接口
   * Copyright:  Copyright (c) 2003
   * Company:   国电信息中心
   * @author 张治中
   * @version 1.0
   * XML处理工具的 运算和实现部分 的接口
   */
  public interface XMLTool
  {
  
  /**
  * 通过解析器把指定的xml文件解析生成java对象。
  * 例如org.w3c.dom.document.  
  * @param path - xml文件路径(包括文件名).
  * @param vali - 备用参数。和XMLParser中的parse
  * (String path,boolean vali)对应。默认为false.
  * @return Object
  * @roseuid 3ECC1EAB0007
  */
  public Object Build(String path, boolean vali);
  /**
  * 通过解析器把指定的xml字符串解析生成java对象。
  * 例如org.w3c.dom.document.  
  * @param xmlString xml字符串
  * @return Object
  * @roseuid 3ECC1EAB0007
  */
  public Object Build(String xmlString);
  /**
  * 设定document.
  * @param docs -document.
  */
  public void setdocument.ource(document.nbspdocs);
  
  /**
  * 设定XML解析器,各个解析器差别较大,
  * 建议在class中固化解析器.
  * @param ParserName - 解析器名称
  * @param ClassName -
  * 解析器class名,如果是已知解析器(XMLParserFactory中固化的),
  * 可以传null或空字符串
  * @roseuid 3ECC1EBA0366
  */
  public void setParser(String ParserName,
   String ClassName);
  
  /**
  * 设定指定节点的单个属性
  * @param NodeName 节点名
  * @param propertyName attribute名,
  * 如果为空则指定NodeName节点的节点值
  * @param value attribute或节点的值
  * @param setall 是否全部的节点都更新
  * @roseuid 3ECB3FA50317
  */
  
  public void setProperty(String NodeName,String
   propertyName,String value,boolean setall);
  /**
  * 获得指定节点的单个属性
  * @param NodeName 节点名
  * @param propertyName attribute名,
  * 如果为空,就找出节点的值
  * @return String
  * @roseuid 3ECB3FA50317
  */
  public String getProperty(String NodeName,
   String propertyName);
  /**
  * 获得

查看本文来源


  XMLToolTest.class实现了对xml文档的操作。包括建立一个新xml document.档结构及内容或从指定xml文件或的document.构和内容,output到指定的xml文件(或更新xml文件),获取和设定指定节点名的指定属性(或属性列表),在指定节点添加子节点、删除子节点、编辑子节点(先删除在添加,待完善),支持在文档中定位(下标定位,和查询定位,如:定位到test节点的 name attribute的value="张治中"的节点,有简单的复合查询定位,暂时是全and的关系. :) ),定位后可以和全面的操作联合使用(有点数据库的影子,和自己想做的应用有关)。后来又根据它做了一个数据库和xml对导的例子。代码如下:
  
  package com.ceic.workflow.xml.Tool;
  import com.ceic.workflow.xml.*;
  import org.w3c.dom.*;
  /**
   * Title:    XML处理工具的 运算和实现部分的接口
   * Description: XML处理工具的 运算和实现部分的接口
   * Copyright:  Copyright (c) 2003
   * Company:   国电信息中心
   * @author 张治中
   * @version 1.0
   * XML处理工具的 运算和实现部分 的接口
   * XMLTool的实现子类,其中的XML解析器从XMLParserFactory中获得.
   * 没有说明的方法和参数参见XMLTool接口.
   */
  public class XMLToolTest implements XMLTool
  {
  
   private XMLParser parser;
   private String ParserType=
    XMLParserFactory.getDefaultType();
   private String ParserClassName="";
   private int Index=0;
   private String markName="";
   private document.nbspdoc;
   private int DefaultBegin=0;
   private String encoding="UTF8";
   private String filepath="";
   private boolean EnableMakeUp=false;
   private String header="";
    public XMLToolTest()
    {
  
    }
    public Object Build(String path, boolean vali)
    {
     if(path!=null&&path.length() >0){
      parser=XMLParserFactory.getXMLParser
      (ParserType,ParserClassName);
      if(parser!=null){
      doc=(document.parser.parse(path,vali);
      filepath=path;
      return doc;
      }
     }
    return null;
    }
    public Object Build(String xmlString)
    {
     if(xmlString!=null&&xmlString.length() >0){
      parser=XMLParserFactory.getXMLParser
      (ParserType,ParserClassName);
      if(parser!=null){
      doc=(document.parser.parseString(xmlString);
      filepath="";
      return doc;
      }
     }
    return null;
    }
    public void setdocument.ource(document.nbspdocs){
     doc=docs;
    }
  
    public void setParser(String ParserName, String ClassName)
    {
    if(ParserName!=null&&ParserName.length() >0){
     ParserType=ParserName;
     ParserClassName=ClassName;
    }
    }
  
    public void setProperty(String NodeName,String
    propertyName,String value,boolean setall){
     try{
      NodeList list=doc.getElementsByTagName(NodeName);
      if(list.getLength() >0&&value!=null&&value.length()>0)
       {
       if(setall){
        for(int i=0;i  
         if(propertyName!=null&&propertyName.length()>0)
      {
  
          ((Element)list.item(i)).setAttribute
   (propertyName,value);
         }
        else{
          list.item(i).setNodevalue(value);
        }
       }
  
       }else{
  
       if(propertyName!=null&&propertyName.length()>0){
        if(NodeName.equals(markName)){
          ((Element)list.item(Index)).setAttribute
   (propertyName,value);
         }
       else{
          ((Element)list.item(DefaultBegin)).
       setAttribute(propertyName,value);
       }
      }else{
  
       if(NodeName.equals(markName)){
          list.item(Index).setNodevalue(value);
        }
       else{
         list.item(DefaultBegin).setNodevalue(value);
       }
  
      }
      }
     }
     }catch(Exception ee){
      System.out.println("设定"+NodeName+"节点的"+
      propertyName+"属性出错");
     }
    }
  
    public String getProperty(String NodeName,
     String propertyName)
    {
     try{
     NodeList list=doc.getElementsByTagName(NodeName);
     if(list.getLength() >0){
     if(propertyName!=null&&propertyName.length() >0){
      if(NodeName.equals(markName)){
       return ((Element)list.item(Index)).getAttribute
    (propertyName);
      }else{
       return ((Element)list.item(DefaultBegin)).
    getAttribute(propertyName);
      }
     }else{
      if(NodeName.equals(markName)){
       return ((Element)list.item(Index)).getNodevalue()
      }else{
       return ((Element)list.item(DefaultBegin)).
    getNodevalue()
      }
     }
     }
     return null;
     }catch(Exception ee){
      System.out.println("getProperty("+NodeName+","+
      propertyName+");出错"+ee.getMessage());
      return null;
     }
   }
   public String[] getPropertys(String NodeName,
    String propertyName)
    {
     try{
      String[] temp;
      NodeList list=doc.getElementsByTagName(NodeName);
      if(list.getLength() >0){
       if(propertyName!=null&&propertyName.length() >0){
        temp=new String[list.getLength()];
        for(int i=0;i         temp[i]=((Element)list.item(i)).
      getAttribute(propertyName);
        }
        return temp;
       }else{
        temp=new String[list.getLength()];
        for(int i=0;i         temp[i]=((Element)list.item(i)).getNodevalue()
        }
        return temp;
       }
      }
      return null;
     }catch(Exception ee){
      System.out.println("getPropertys("+NodeName+","+
      propertyName+");出错");
      return null;
     }
   }
  
   public String getParent(String returnAttr){
    String tempreturn="";
    String tempnode=markName
    int tempindex=Index
    NodeList list=doc.getElementsByTagName(markName);
    Node node=list.item(Index);
    if(returnAttr!=null&&returnAttr.length() >0){
     tempreturn=((Element)node.getParentNode()).
      getAttribute(returnAttr);
    }else{
     tempreturn=node.getParentNode().getNodevalue()
    }
    return tempreturn;
    }
  
  
    public void setFormat(String XMLToolName,
     String classname){}
  
    public void addNode(String parent, Node NodeName,
     boolean addall)
    {
     try{
     NodeList list=doc.getElementsByTagName(parent);
  
     if(list.getLength() >0){
      if(addall){
       for(int i=0;i        int type=NodeName.getNodeType()
        switch(type){
         case Node.ATTRIBUTE_NODE: {
          ((Element)list.item(i)).setAttribute(((Attr)
       NodeName).getName() ,((Attr)NodeName).getvalue());
         }
         default:{
          list.item(i).appendChild(NodeName);

查看本文来源


  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

查看本文来源

推广二维码
邮件订阅

如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

重磅专题