|
What this is
Other links
The source code/* CVS ID: $Id: XMLCommon.java,v 1.1.1.1 2002/10/02 18:42:54 wastl Exp $ */ package net.wastl.webmail.xml; import org.w3c.dom.*; 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 |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.