1 37 38 package org.htmlcleaner; 39 40 import java.io.BufferedWriter ; 41 import java.io.IOException ; 42 import java.io.Writer ; 43 import java.util.Iterator ; 44 import java.util.List ; 45 import java.util.Map ; 46 47 53 public abstract class XmlSerializer { 54 55 protected final String XML_DECLARATION = "<?xml version=\"1.0\"?>"; 56 57 protected HtmlCleaner htmlCleaner; 58 protected BufferedWriter writer; 59 60 protected XmlSerializer() { 61 } 62 63 protected XmlSerializer(Writer writer, HtmlCleaner htmlCleaner) { 64 this.writer = new BufferedWriter (writer); 65 this.htmlCleaner = htmlCleaner; 66 } 67 68 protected void createXml(TagNode tagNode) throws IOException { 69 if ( !htmlCleaner.isOmitXmlDeclaration() ) { 70 writer.write(XML_DECLARATION + "\n"); 71 } 72 73 if ( !htmlCleaner.isOmitDoctypeDeclaration() ) { 74 DoctypeToken doctypeToken = htmlCleaner.getDoctype(); 75 if ( doctypeToken != null ) { 76 doctypeToken.serialize(this); 77 } 78 } 79 80 serialize(tagNode); 81 82 writer.flush(); 83 writer.close(); 84 } 85 86 protected String escapeXml(String xmlContent) { 87 return Utils.escapeXml( 88 xmlContent, 89 htmlCleaner.isAdvancedXmlEscape(), 90 htmlCleaner.isRecognizeUnicodeChars(), 91 htmlCleaner.isTranslateSpecialEntities() 92 ); 93 } 94 95 protected boolean dontEscape(TagNode tagNode) { 96 String tagName = tagNode.getName(); 97 return htmlCleaner.isUseCdataForScriptAndStyle() && ("script".equalsIgnoreCase(tagName) || "style".equalsIgnoreCase(tagName)); 98 } 99 100 protected boolean isScriptOrStyle(TagNode tagNode) { 101 String tagName = tagNode.getName(); 102 return "script".equalsIgnoreCase(tagName) || "style".equalsIgnoreCase(tagName); 103 } 104 105 protected void serializeOpenTag(TagNode tagNode, boolean newLine) throws IOException { 106 String tagName = tagNode.getName(); 107 Map tagAtttributes = tagNode.getAttributes(); 108 List tagChildren = tagNode.getChildren(); 109 110 writer.write("<" + tagName); 111 Iterator it = tagAtttributes.keySet().iterator(); 112 while (it.hasNext()) { 113 String attName = (String ) it.next(); 114 String attValue = (String ) tagAtttributes.get(attName); 115 116 if ( htmlCleaner.isOmitXmlnsAttributes() && "xmlns".equals(attName) ) { 117 continue; 118 } 119 120 writer.write(" " + attName + "=\"" + escapeXml(attValue) + "\""); 121 } 122 123 if ( tagChildren.size() == 0 ) { 124 writer.write("/>"); 125 if (newLine) { 126 writer.write("\n"); 127 } 128 } else if (dontEscape(tagNode)) { 129 writer.write("><![CDATA["); 130 } else { 131 writer.write(">"); 132 } 133 } 134 135 protected void serializeOpenTag(TagNode tagNode) throws IOException { 136 serializeOpenTag(tagNode, true); 137 } 138 139 protected void serializeEndTag(TagNode tagNode, boolean newLine) throws IOException { 140 String tagName = tagNode.getName(); 141 142 if (dontEscape(tagNode)) { 143 writer.write("]]>"); 144 } 145 146 writer.write( "</" + tagName + ">" ); 147 148 if (newLine) { 149 writer.write("\n"); 150 } 151 } 152 153 Writer getWriter() { 154 return writer; 155 } 156 157 protected void serializeEndTag(TagNode tagNode) throws IOException { 158 serializeEndTag(tagNode, true); 159 } 160 161 162 protected abstract void serialize(TagNode tagNode) throws IOException ; 163 164 } | Popular Tags |