1 17 package org.apache.tomcat.util; 18 19 import java.io.IOException ; 20 import java.io.InputStream ; 21 import java.io.OutputStream ; 22 import java.io.StringReader ; 23 24 import javax.xml.parsers.DocumentBuilder ; 25 import javax.xml.parsers.DocumentBuilderFactory ; 26 import javax.xml.parsers.ParserConfigurationException ; 27 import javax.xml.transform.OutputKeys ; 28 import javax.xml.transform.Transformer ; 29 import javax.xml.transform.TransformerException ; 30 import javax.xml.transform.TransformerFactory ; 31 import javax.xml.transform.dom.DOMSource ; 32 import javax.xml.transform.stream.StreamResult ; 33 34 import org.w3c.dom.Document ; 35 import org.w3c.dom.NamedNodeMap ; 36 import org.w3c.dom.Node ; 37 import org.xml.sax.EntityResolver ; 38 import org.xml.sax.InputSource ; 39 import org.xml.sax.SAXException ; 40 41 42 47 public class DomUtil { 48 private static org.apache.commons.logging.Log log= 49 org.apache.commons.logging.LogFactory.getLog( DomUtil.class ); 50 51 53 55 public static String getContent(Node n ) { 56 if( n==null ) return null; 57 Node n1=DomUtil.getChild(n, Node.TEXT_NODE); 58 59 if( n1==null ) return null; 60 61 String s1=n1.getNodeValue(); 62 return s1.trim(); 63 } 64 65 69 public static Node getChild( Node parent, String name ) { 70 if( parent==null ) return null; 71 Node first=parent.getFirstChild(); 72 if( first==null ) return null; 73 74 for (Node node = first; node != null; 75 node = node.getNextSibling()) { 76 if( node.getNodeType()!=Node.ELEMENT_NODE) 78 continue; 79 if( name != null && 80 name.equals( node.getNodeName() ) ) { 81 return node; 82 } 83 if( name == null ) { 84 return node; 85 } 86 } 87 return null; 88 } 89 90 public static String getAttribute(Node element, String attName ) { 91 NamedNodeMap attrs=element.getAttributes(); 92 if( attrs==null ) return null; 93 Node attN=attrs.getNamedItem(attName); 94 if( attN==null ) return null; 95 return attN.getNodeValue(); 96 } 97 98 public static void setAttribute(Node node, String attName, String val) { 99 NamedNodeMap attributes=node.getAttributes(); 100 Node attNode=node.getOwnerDocument().createAttribute(attName); 101 attNode.setNodeValue( val ); 102 attributes.setNamedItem(attNode); 103 } 104 105 public static void removeAttribute( Node node, String attName ) { 106 NamedNodeMap attributes=node.getAttributes(); 107 attributes.removeNamedItem(attName); 108 } 109 110 111 113 public static void setText(Node node, String val) { 114 Node chld=DomUtil.getChild(node, Node.TEXT_NODE); 115 if( chld == null ) { 116 Node textN=node.getOwnerDocument().createTextNode(val); 117 node.appendChild(textN); 118 return; 119 } 120 chld.setNodeValue(val); 122 } 123 124 130 public static Node findChildWithAtt(Node parent, String elemName, 131 String attName, String attVal) { 132 133 Node child=DomUtil.getChild(parent, Node.ELEMENT_NODE); 134 if( attVal== null ) { 135 while( child!= null && 136 ( elemName==null || elemName.equals( child.getNodeName())) && 137 DomUtil.getAttribute(child, attName) != null ) { 138 child=getNext(child, elemName, Node.ELEMENT_NODE ); 139 } 140 } else { 141 while( child!= null && 142 ( elemName==null || elemName.equals( child.getNodeName())) && 143 ! attVal.equals( DomUtil.getAttribute(child, attName)) ) { 144 child=getNext(child, elemName, Node.ELEMENT_NODE ); 145 } 146 } 147 return child; 148 } 149 150 151 153 public static String getChildContent( Node parent, String name ) { 154 Node first=parent.getFirstChild(); 155 if( first==null ) return null; 156 for (Node node = first; node != null; 157 node = node.getNextSibling()) { 158 if( name.equals( node.getNodeName() ) ) { 160 return getContent( node ); 161 } 162 } 163 return null; 164 } 165 166 168 public static Node getChild( Node parent, int type ) { 169 Node n=parent.getFirstChild(); 170 while( n!=null && type != n.getNodeType() ) { 171 n=n.getNextSibling(); 172 } 173 if( n==null ) return null; 174 return n; 175 } 176 177 179 public static Node getNext( Node current ) { 180 String name=current.getNodeName(); 181 int type=current.getNodeType(); 182 return getNext( current, name, type); 183 } 184 185 187 public static Node getNext( Node current, String name, int type) { 188 Node first=current.getNextSibling(); 189 if( first==null ) return null; 190 191 for (Node node = first; node != null; 192 node = node.getNextSibling()) { 193 194 if( type >= 0 && node.getNodeType() != type ) continue; 195 if( name==null ) 197 return node; 198 if( name.equals( node.getNodeName() ) ) { 199 return node; 200 } 201 } 202 return null; 203 } 204 205 public static class NullResolver implements EntityResolver { 206 public InputSource resolveEntity (String publicId, 207 String systemId) 208 throws SAXException , IOException 209 { 210 if( log.isTraceEnabled()) 211 log.trace("ResolveEntity: " + publicId + " " + systemId); 212 return new InputSource (new StringReader ("")); 213 } 214 } 215 216 public static void setAttributes( Object o, Node parent) 217 { 218 NamedNodeMap attrs=parent.getAttributes(); 219 if( attrs==null ) return; 220 221 for (int i=0; i<attrs.getLength(); i++ ) { 222 Node n=attrs.item(i); 223 String name=n.getNodeName(); 224 String value=n.getNodeValue(); 225 226 if( log.isTraceEnabled() ) 227 log.trace("Attribute " + parent.getNodeName() + " " + 228 name + "=" + value); 229 try { 230 IntrospectionUtils.setProperty(o, name, value); 231 } catch( Exception ex ) { 232 ex.printStackTrace(); 233 } 234 } 235 } 236 237 239 public static Document readXml(InputStream is) 240 throws SAXException , IOException , ParserConfigurationException 241 { 242 DocumentBuilderFactory dbf = 243 DocumentBuilderFactory.newInstance(); 244 245 dbf.setValidating(false); 246 dbf.setIgnoringComments(false); 247 dbf.setIgnoringElementContentWhitespace(true); 248 251 DocumentBuilder db = null; 252 db = dbf.newDocumentBuilder(); 253 db.setEntityResolver( new NullResolver() ); 254 255 257 Document doc = db.parse(is); 258 return doc; 259 } 260 261 public static void writeXml( Node n, OutputStream os ) 262 throws TransformerException 263 { 264 TransformerFactory tf=TransformerFactory.newInstance(); 265 Transformer t=tf.newTransformer(); 267 t.setOutputProperty(OutputKeys.INDENT, "yes"); 268 t.transform(new DOMSource ( n ), new StreamResult ( os )); 269 } 270 } 271 | Popular Tags |