1 package net.sf.cantina.util; 2 3 import net.sf.cantina.exceptions.InvalidXmlException; 4 import net.sf.cantina.Document; 5 import org.apache.log4j.Logger; 6 import org.dom4j.DocumentFactory; 7 import org.dom4j.DocumentHelper; 8 import org.dom4j.DocumentType; 9 import org.dom4j.io.SAXReader; 10 import org.xml.sax.InputSource; 11 import org.xml.sax.SAXParseException; 12 13 import javax.xml.parsers.SAXParser; 14 import javax.xml.parsers.SAXParserFactory; 15 import java.io.StringReader; 16 import java.util.ArrayList; 17 import java.util.List; 18 19 /*** 20 * @author Stephane JAIS 21 */ 22 public abstract class XmlHelper 23 { 24 private static final Logger logger = Logger.getLogger(XmlHelper.class); 25 26 public static void checkXml(String xmlString, boolean validate) 27 throws Exception 28 { 29 List errors = new ArrayList(); 30 try 31 { 32 SAXParserFactory factory; 33 SAXParser parser; 34 factory = SAXParserFactory.newInstance(); 35 factory.setValidating(validate); 36 parser = factory.newSAXParser(); 37 parser.parse(new InputSource(new StringReader(xmlString)), 38 new SAXDefaultHandler(errors)); 39 } catch (SAXParseException e) 40 { 41 InvalidXmlException e1 = new InvalidXmlException("Content has XML errors.", 42 (SAXParseException[]) errors.toArray(new SAXParseException[]{})); 43 for (int i = 1; i <= e1.getErrors().length; i++) 44 logger.debug("Error #" + i, e1); 45 throw e1; 46 } 47 } 48 49 public static String surroundTextWithRoot(String text, 50 String rootElementName, 51 String publicId, 52 String system) 53 throws Exception 54 { 55 SAXReader reader = new SAXReader(); 56 StringBuffer sb = new StringBuffer(); 57 reader.setEntityResolver(new SAXDefaultHandler(new ArrayList(), sb)); 58 DocumentFactory df = reader.getDocumentFactory(); 59 DocumentType docType = df.createDocType(rootElementName, publicId, system); 60 org.dom4j.Document doc; 61 doc = DocumentHelper.parseText( 62 "<" + rootElementName + ">" + 63 text + 64 "</" + rootElementName + ">"); 65 doc.setDocType(docType); 66 return doc.asXML(); 67 } 68 69 70 public static String stripXml(String content) 71 throws Exception 72 { 73 SAXReader reader = new SAXReader(); 74 reader.setEntityResolver(new SAXDefaultHandler(new ArrayList())); 75 reader.setStripWhitespaceText(true); 76 org.dom4j.Document doc = reader.read(new StringReader(content)); 77 return doc.getStringValue(); 78 } 79 80 public static String escapeXml(String content) 81 { 82 StringBuffer result = new StringBuffer(); 83 for (int i = 0; i < content.length(); i++) 84 { 85 char ch = content.charAt(i); 86 if (ch == '\'') 87 result.append("'"); 88 else if (ch == '"') 89 result.append("""); 90 else if (ch == '<') 91 result.append("<"); 92 else if (ch == '>') 93 result.append(">"); 94 else if (ch == '&') 95 result.append("&"); 96 else 97 result.append(ch); 98 } 99 return result.toString(); 100 } 101 }