⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlcommon.java

📁 java 开发的一个电子邮局,挺实用的
💻 JAVA
字号:
/* CVS ID: $Id: XMLCommon.java,v 1.7 2001/01/11 11:00:44 wastl Exp $ */
package net.wastl.webmail.xml;

import org.w3c.dom.*;
import org.apache.xerces.framework.*;
import java.io.*;
import java.util.*;

/*
 * XMLCommon.java
 *
 * Created: Sat Mar 11 15:59:22 2000
 *
 * Copyright (C) 2000 Sebastian Schaffert
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
/**
 * This class contains some static methods that are used commonly in other WebMail parts.
 *
 *
 * @author Sebastian Schaffert
 * @version
 */

public final class XMLCommon  {

    public static Element getElementByAttribute(Element root, String tagname, String attribute, String att_value) {
	NodeList nl=root.getElementsByTagName(tagname);
	for(int i=0; i<nl.getLength();i++) {
	    Element elem=(Element)nl.item(i);
	    if(elem.getAttribute(attribute).equals(att_value)) {
		return elem;
	    }
	}
	return null;
    }


    public static String getElementTextValue(Element e) {
	e.normalize();
	NodeList nl=e.getChildNodes();
	if(nl.getLength() <= 0) {
	    System.err.println("Elements: "+nl.getLength());
	    return "";
	} else {
	    String s="";
	    for(int i=0;i<nl.getLength();i++) {
		if(nl.item(i) instanceof CharacterData) {
		    s+=nl.item(i).getNodeValue();
		}
	    }
	    return s.trim();
	}
    }

    public static void setElementTextValue(Element e,String text) {
	setElementTextValue(e,text,false);
    }

    public static void setElementTextValue(Element e,String text, boolean cdata) {
	Document root=e.getOwnerDocument();
	e.normalize();
	if(e.hasChildNodes()) {
	    NodeList nl=e.getChildNodes();
	    
	    /* This suxx: NodeList Object is changed when removing children !!!
	       I will store all nodes that should be deleted in a Vector and delete them afterwards */
	    int length=nl.getLength();
	
	    Vector v=new Vector(nl.getLength());
	    for(int i=0;i<length;i++) {
		if(nl.item(i) instanceof CharacterData) {	
		    v.addElement(nl.item(i));
		}
	    }
	    Enumeration enum=v.elements();
	    while(enum.hasMoreElements()) {
		Node n=(Node)enum.nextElement();
		e.removeChild(n);
	    }
	}

	if(cdata) {
	    e.appendChild(root.createCDATASection(text));
	} else {
	    e.appendChild(root.createTextNode(text));
	}
    }

    public static String getTagValue(Element e, String tagname) {
	NodeList namel=e.getElementsByTagName(tagname);
	if(namel.getLength()>0) {
	    return getElementTextValue((Element)namel.item(0));
	} else {
	    return null;
	}
    }

    /**
     * Set the value of the first tag below e with name tagname to text.
     */
    public static void setTagValue(Element e,String tagname, String text) {
	setTagValue(e,tagname,text,false);
    }

    public static void setTagValue(Element e,String tagname, String text,boolean cdata) {
	try {
	    setTagValue(e,tagname,text,false,"",cdata);
	} catch(Exception ex) {}
    }

    public static void setTagValue(Element e,String tagname, String text, 
				      boolean unique,String errormsg) throws Exception
    {
	setTagValue(e,tagname,text,unique,errormsg,false);
    }

    public static void setTagValue(Element e,String tagname, String text, 
				   boolean unique,String errormsg, boolean cdata) 
	throws Exception {

	if(text == null || tagname == null) throw new NullPointerException("Text or Tagname may not be null!");

	Document root=e.getOwnerDocument();

	if(unique) {
	    // Check for double entries!
	    NodeList nl=((Element)e.getParentNode()).getElementsByTagName(tagname);
	    for(int i=0;i<nl.getLength();i++) {
		if(getElementTextValue((Element)nl.item(0)).equals(text)) {
		    throw new Exception(errormsg);
		}
	    }
	}
	NodeList namel=e.getElementsByTagName(tagname);
	Element elem;
	if(namel.getLength()<=0) {
	    System.err.println("Creating Element "+tagname+"; will set to "+text);
	    elem=root.createElement(tagname);
	    e.appendChild(elem);
	} else {
	    elem=(Element)namel.item(0);
	}
	//debugXML(root);
	setElementTextValue(elem,text,cdata);
    }

    public static void genericRemoveAll(Element parent, String tagname) {
	NodeList nl=parent.getChildNodes();
	Vector parts=new Vector();
	for(int i=0;i<nl.getLength();i++) {
	    if(nl.item(i) instanceof Element) {
		Element elem=(Element)nl.item(i);
		if(elem.getTagName().equals(tagname)) {
		    parts.addElement(elem);
		}
	    }
	}
	Enumeration enum=parts.elements();
	while(enum.hasMoreElements()) {
	    parent.removeChild((Node)enum.nextElement());
	}
    }


    public static void writeXML(Document d, OutputStream os, String sysID) throws IOException {
	// Modified by exce, start
	/**
	 * To support i18n, we have to specify the encoding of 
	 * output writer to UTF-8 when we writing the XML.
	 */
	// PrintWriter out=new PrintWriter(os);
	PrintWriter out = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
	// Modified by exce, end

	out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
	out.println();
	out.println("<!DOCTYPE "+d.getDoctype().getName()+" SYSTEM \""+sysID+"\">");
	out.println();
	//d.getDocumentElement().normalize();
	writeXMLwalkTree(d.getDocumentElement(),0,out);
	out.flush();
    }
    
    protected static void writeXMLwalkTree(Node node, int indent, PrintWriter out) {
	if(node == null) {
	    System.err.println("??? Node was null ???");
	    return;
	}
	if(node.hasChildNodes()) {
	    if(node instanceof Element) {
		Element elem=(Element)node;
		//elem.normalize();
		out.print("\n");
		for(int j=0;j<indent;j++) {
		    out.print(" ");
		}
		out.print("<"+elem.getTagName());
		NamedNodeMap attrs=elem.getAttributes();
		for(int i=0;i<attrs.getLength();i++) {
		    Attr a=(Attr)attrs.item(i);
		    out.print(" "+a.getName()+"=\""+a.getValue()+"\"");
		}
		out.print(">");
		NodeList nl=node.getChildNodes();
		for(int i=0;i<nl.getLength();i++) {
		    writeXMLwalkTree(nl.item(i),indent+2,out);
		}
// 		for(int j=0;j<indent;j++) {
// 		    out.print(" ");
// 		}
		out.println("</"+elem.getTagName()+">");
	    }
	} else {
	    if(node instanceof Element) {
		Element elem=(Element)node;
		out.print("\n");
		for(int j=0;j<indent;j++) {
		    out.print(" ");
		}
		out.print("<"+elem.getTagName());
		NamedNodeMap attrs=elem.getAttributes();
		for(int i=0;i<attrs.getLength();i++) {
		    Attr a=(Attr)attrs.item(i);
		    out.print(" "+a.getName()+"=\""+a.getValue()+"\"");
		}
		out.println("/>");
	    } else if(node instanceof CDATASection) {
		CDATASection cdata=(CDATASection)node;
// 		for(int j=0;j<indent;j++) {
// 		    out.print(" ");
// 		}
		out.print("<![CDATA["+cdata.getData()+"]]>");
	    } else if(node instanceof Text) {
		Text text=(Text)node;
		StringBuffer buf=new StringBuffer(text.getData().length());
		for(int i=0;i<text.getData().length();i++) {
		    if(text.getData().charAt(i) == '\n' ||
		       text.getData().charAt(i) == '\r' || 
		       text.getData().charAt(i) == ' ' ||
		       text.getData().charAt(i) == '\t') {
			if(buf.length()>0 && buf.charAt(buf.length()-1)!=' ') {
			    buf.append(' ');
			}
		    } else {
			buf.append(text.getData().charAt(i));
		    }
		}
		if(buf.length() > 0 && !buf.toString().equals(" ")) {
		    StringBuffer buf2=new StringBuffer(buf.length()+indent);
// 		    for(int j=0;j<indent;j++) {
// 			buf2.append(' ');
// 		    }
		    buf2.append(buf.toString());
		    out.print(buf2);
		}
	    }
	}
    }

    /**
     * This is a helper function to deal with problems that occur when importing Nodes from
     * JTidy Documents to Xerces Documents.
     */
    public static Node importNode(Document d, Node n, boolean deep) {
	Node r=cloneNode(d,n);
	if(deep) {
	    NodeList nl=n.getChildNodes();
	    for(int i=0;i<nl.getLength();i++) {
		Node n1=importNode(d,nl.item(i),deep);
		r.appendChild(n1);
	    }
	}
	return r;
    }
		    
    public static Node cloneNode(Document d,Node n) {
	Node r=null;
	switch(n.getNodeType()) {
	case Node.TEXT_NODE: 
	    r = d.createTextNode(((Text)n).getData());
	    break;
	case Node.CDATA_SECTION_NODE:
	    r = d.createCDATASection(((CDATASection)n).getData());
	    break;
	case Node.ELEMENT_NODE:
	    r = d.createElement(((Element)n).getTagName());
	    NamedNodeMap map=n.getAttributes();
	    for(int i=0;i<map.getLength();i++) {
		((Element)r).setAttribute(((Attr)map.item(i)).getName(),
					  ((Attr)map.item(i)).getValue());
	    }
	    break;	    
	}
	return r;
    }

    public static synchronized void debugXML(Document d) {	
   	try {
	    FileOutputStream fout=new FileOutputStream("/tmp/webmail.xml."+System.currentTimeMillis());
	    PrintWriter out=new PrintWriter(fout);
	    out.println("Debugging XML:");
	    out.println("==============================================================");

	    writeXML(d,fout,"test");
// 	    OutputFormat of=new OutputFormat(Method.XML,"ISO-8859-1",true);
// 	    of.setIndenting(true);
// 	    of.setIndent(2);
// 	    of.setDoctype(null,d.getDoctype().getName());
// 	    of.setStandalone(false);
// 	    System.err.println("Doctype system:"+of.getDoctypeSystem());
// 	    XMLSerializer ser=new XMLSerializer(System.out,of);
// 	    ser.serialize(d.getDocumentElement());
	    out.println("==============================================================");	    
	    fout.flush();
	    fout.close();
	} catch(Exception ex) {
	    ex.printStackTrace();
	}
    }
} // XMLCommon

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -