XMLCommon.java
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:8k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /* CVS ID: $Id: XMLCommon.java,v 1.5 2000/04/18 13:13:38 wastl Exp $ */
  2. package net.wastl.webmail.xml;
  3. import org.w3c.dom.*;
  4. import org.apache.xerces.framework.*;
  5. import java.io.*;
  6. import java.util.*;
  7. /*
  8.  * XMLCommon.java
  9.  *
  10.  * Created: Sat Mar 11 15:59:22 2000
  11.  *
  12.  * Copyright (C) 2000 Sebastian Schaffert
  13.  * 
  14.  * This program is free software; you can redistribute it and/or
  15.  * modify it under the terms of the GNU General Public License
  16.  * as published by the Free Software Foundation; either version 2
  17.  * of the License, or (at your option) any later version.
  18.  * 
  19.  * This program is distributed in the hope that it will be useful,
  20.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22.  * GNU General Public License for more details.
  23.  * 
  24.  * You should have received a copy of the GNU General Public License
  25.  * along with this program; if not, write to the Free Software
  26.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  27.  */
  28. /**
  29.  * This class contains some static methods that are used commonly in other WebMail parts.
  30.  *
  31.  *
  32.  * @author Sebastian Schaffert
  33.  * @version
  34.  */
  35. public final class XMLCommon  {
  36.     public static Element getElementByAttribute(Element root, String tagname, String attribute, String att_value) {
  37. NodeList nl=root.getElementsByTagName(tagname);
  38. for(int i=0; i<nl.getLength();i++) {
  39.     Element elem=(Element)nl.item(i);
  40.     if(elem.getAttribute(attribute).equals(att_value)) {
  41. return elem;
  42.     }
  43. }
  44. return null;
  45.     }
  46.     public static String getElementTextValue(Element e) {
  47. e.normalize();
  48. NodeList nl=e.getChildNodes();
  49. if(nl.getLength() <= 0) {
  50.     System.err.println("Elements: "+nl.getLength());
  51.     return "";
  52. } else {
  53.     String s="";
  54.     for(int i=0;i<nl.getLength();i++) {
  55. if(nl.item(i) instanceof CharacterData) {
  56.     s+=nl.item(i).getNodeValue();
  57. }
  58.     }
  59.     return s.trim();
  60. }
  61.     }
  62.     public static void setElementTextValue(Element e,String text) {
  63. setElementTextValue(e,text,false);
  64.     }
  65.     public static void setElementTextValue(Element e,String text, boolean cdata) {
  66. Document root=e.getOwnerDocument();
  67. e.normalize();
  68. if(e.hasChildNodes()) {
  69.     NodeList nl=e.getChildNodes();
  70.     
  71.     /* This suxx: NodeList Object is changed when removing children !!!
  72.        I will store all nodes that should be deleted in a Vector and delete them afterwards */
  73.     int length=nl.getLength();
  74.     Vector v=new Vector(nl.getLength());
  75.     for(int i=0;i<length;i++) {
  76. if(nl.item(i) instanceof CharacterData) {
  77.     v.addElement(nl.item(i));
  78. }
  79.     }
  80.     Enumeration enum=v.elements();
  81.     while(enum.hasMoreElements()) {
  82. Node n=(Node)enum.nextElement();
  83. e.removeChild(n);
  84.     }
  85. }
  86. if(cdata) {
  87.     e.appendChild(root.createCDATASection(text));
  88. } else {
  89.     e.appendChild(root.createTextNode(text));
  90. }
  91.     }
  92.     public static String getTagValue(Element e, String tagname) {
  93. NodeList namel=e.getElementsByTagName(tagname);
  94. if(namel.getLength()>0) {
  95.     return getElementTextValue((Element)namel.item(0));
  96. } else {
  97.     return null;
  98. }
  99.     }
  100.     /**
  101.      * Set the value of the first tag below e with name tagname to text.
  102.      */
  103.     public static void setTagValue(Element e,String tagname, String text) {
  104. setTagValue(e,tagname,text,false);
  105.     }
  106.     public static void setTagValue(Element e,String tagname, String text,boolean cdata) {
  107. try {
  108.     setTagValue(e,tagname,text,false,"",cdata);
  109. } catch(Exception ex) {}
  110.     }
  111.     public static void setTagValue(Element e,String tagname, String text, 
  112.       boolean unique,String errormsg) throws Exception
  113.     {
  114. setTagValue(e,tagname,text,unique,errormsg,false);
  115.     }
  116.     public static void setTagValue(Element e,String tagname, String text, 
  117.    boolean unique,String errormsg, boolean cdata) 
  118. throws Exception {
  119. if(text == null || tagname == null) throw new NullPointerException("Text or Tagname may not be null!");
  120. Document root=e.getOwnerDocument();
  121. if(unique) {
  122.     // Check for double entries!
  123.     NodeList nl=((Element)e.getParentNode()).getElementsByTagName(tagname);
  124.     for(int i=0;i<nl.getLength();i++) {
  125. if(getElementTextValue((Element)nl.item(0)).equals(text)) {
  126.     throw new Exception(errormsg);
  127. }
  128.     }
  129. }
  130. NodeList namel=e.getElementsByTagName(tagname);
  131. Element elem;
  132. if(namel.getLength()<=0) {
  133.     System.err.println("Creating Element "+tagname+"; will set to "+text);
  134.     elem=root.createElement(tagname);
  135.     e.appendChild(elem);
  136. } else {
  137.     elem=(Element)namel.item(0);
  138. }
  139. debugXML(root);
  140. setElementTextValue(elem,text,cdata);
  141.     }
  142.     public static void genericRemoveAll(Element parent, String tagname) {
  143. NodeList nl=parent.getChildNodes();
  144. Vector parts=new Vector();
  145. for(int i=0;i<nl.getLength();i++) {
  146.     if(nl.item(i) instanceof Element) {
  147. Element elem=(Element)nl.item(i);
  148. if(elem.getTagName().equals(tagname)) {
  149.     parts.addElement(elem);
  150. }
  151.     }
  152. }
  153. Enumeration enum=parts.elements();
  154. while(enum.hasMoreElements()) {
  155.     parent.removeChild((Node)enum.nextElement());
  156. }
  157.     }
  158.     public static void writeXML(Document d, OutputStream os, String sysID) throws IOException {
  159. PrintWriter out=new PrintWriter(os);
  160. out.println("<?xml version="1.0" encoding="UTF-8"?>");
  161. out.println();
  162. out.println("<!DOCTYPE "+d.getDoctype().getName()+" SYSTEM ""+sysID+"">");
  163. out.println();
  164. //d.getDocumentElement().normalize();
  165. writeXMLwalkTree(d.getDocumentElement(),0,out);
  166. out.flush();
  167.     }
  168.     
  169.     protected static void writeXMLwalkTree(Node node, int indent, PrintWriter out) {
  170. if(node == null) {
  171.     System.err.println("??? Node was null ???");
  172.     return;
  173. }
  174. if(node.hasChildNodes()) {
  175.     if(node instanceof Element) {
  176. Element elem=(Element)node;
  177. //elem.normalize();
  178. out.print("n");
  179. for(int j=0;j<indent;j++) {
  180.     out.print(" ");
  181. }
  182. out.print("<"+elem.getTagName());
  183. NamedNodeMap attrs=elem.getAttributes();
  184. for(int i=0;i<attrs.getLength();i++) {
  185.     Attr a=(Attr)attrs.item(i);
  186.     out.print(" "+a.getName()+"=""+a.getValue()+""");
  187. }
  188. out.print(">");
  189. NodeList nl=node.getChildNodes();
  190. for(int i=0;i<nl.getLength();i++) {
  191.     writeXMLwalkTree(nl.item(i),indent+2,out);
  192. }
  193. //  for(int j=0;j<indent;j++) {
  194. //      out.print(" ");
  195. //  }
  196. out.println("</"+elem.getTagName()+">");
  197.     }
  198. } else {
  199.     if(node instanceof Element) {
  200. Element elem=(Element)node;
  201. out.print("n");
  202. for(int j=0;j<indent;j++) {
  203.     out.print(" ");
  204. }
  205. out.print("<"+elem.getTagName());
  206. NamedNodeMap attrs=elem.getAttributes();
  207. for(int i=0;i<attrs.getLength();i++) {
  208.     Attr a=(Attr)attrs.item(i);
  209.     out.print(" "+a.getName()+"=""+a.getValue()+""");
  210. }
  211. out.println("/>");
  212.     } else if(node instanceof CDATASection) {
  213. CDATASection cdata=(CDATASection)node;
  214. //  for(int j=0;j<indent;j++) {
  215. //      out.print(" ");
  216. //  }
  217. out.print("<![CDATA["+cdata.getData()+"]]>");
  218.     } else if(node instanceof Text) {
  219. Text text=(Text)node;
  220. StringBuffer buf=new StringBuffer(text.getData().length());
  221. for(int i=0;i<text.getData().length();i++) {
  222.     if(text.getData().charAt(i) == 'n' ||
  223.        text.getData().charAt(i) == 'r' || 
  224.        text.getData().charAt(i) == ' ' ||
  225.        text.getData().charAt(i) == 't') {
  226. if(buf.length()>0 && buf.charAt(buf.length()-1)!=' ') {
  227.     buf.append(' ');
  228. }
  229.     } else {
  230. buf.append(text.getData().charAt(i));
  231.     }
  232. }
  233. if(buf.length() > 0 && !buf.toString().equals(" ")) {
  234.     StringBuffer buf2=new StringBuffer(buf.length()+indent);
  235. //      for(int j=0;j<indent;j++) {
  236. //  buf2.append(' ');
  237. //      }
  238.     buf2.append(buf.toString());
  239.     out.print(buf2);
  240. }
  241.     }
  242. }
  243.     }
  244.     
  245.     public static synchronized void debugXML(Document d) {
  246.     try {
  247.     FileOutputStream fout=new FileOutputStream("/tmp/webmail.xml."+System.currentTimeMillis());
  248.     PrintWriter out=new PrintWriter(fout);
  249.     out.println("Debugging XML:");
  250.     out.println("==============================================================");
  251.     writeXML(d,fout,"test");
  252. //      OutputFormat of=new OutputFormat(Method.XML,"ISO-8859-1",true);
  253. //      of.setIndenting(true);
  254. //      of.setIndent(2);
  255. //      of.setDoctype(null,d.getDoctype().getName());
  256. //      of.setStandalone(false);
  257. //      System.err.println("Doctype system:"+of.getDoctypeSystem());
  258. //      XMLSerializer ser=new XMLSerializer(System.out,of);
  259. //      ser.serialize(d.getDocumentElement());
  260.     out.println("==============================================================");     
  261.     fout.flush();
  262.     fout.close();
  263. } catch(Exception ex) {
  264.     ex.printStackTrace();
  265. }
  266.     }
  267. } // XMLCommon