1 5 package prefuse.util.io; 6 7 import java.io.PrintWriter ; 8 import java.util.ArrayList ; 9 10 26 public class XMLWriter { 27 28 private PrintWriter m_out; 29 private int m_bias = 0; 30 private int m_tab; 31 private ArrayList m_tagStack = new ArrayList (); 32 33 37 public XMLWriter(PrintWriter out) { 38 this(out, 2); 39 } 40 41 47 public XMLWriter(PrintWriter out, int tabLength) { 48 m_out = out; 49 m_tab = 2; 50 } 51 52 57 public void print(String s) { 58 m_out.print(s); 59 } 60 61 67 public void println(String s) { 68 m_out.print(s); 69 m_out.print("\n"); 70 } 71 72 75 public void println() { 76 m_out.print("\n"); 77 } 78 79 84 public void begin() { 85 m_out.print("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 86 println(); 87 } 88 89 97 public void begin(String header, int bias) { 98 begin(); 99 m_out.print(header); 100 m_bias = bias; 101 } 102 103 108 public void comment(String comment) { 109 spacing(); 110 m_out.print("<!-- "); 111 m_out.print(comment); 112 m_out.print(" -->"); 113 println(); 114 } 115 116 125 protected void tag(String tag, String [] names, String [] values, 126 int nattr, boolean close) 127 { 128 spacing(); 129 m_out.print('<'); 130 m_out.print(tag); 131 for ( int i=0; i<nattr; ++i ) { 132 m_out.print(' '); 133 m_out.print(names[i]); 134 m_out.print('='); 135 m_out.print('\"'); 136 escapeString(values[i]); 137 m_out.print('\"'); 138 } 139 if ( close ) m_out.print('/'); 140 m_out.print('>'); 141 println(); 142 143 if ( !close ) { 144 m_tagStack.add(tag); 145 } 146 } 147 148 156 public void tag(String tag, String [] names, String [] values, int nattr) 157 { 158 tag(tag, names, values, nattr, true); 159 } 160 161 169 public void start(String tag, String [] names, String [] values, int nattr) 170 { 171 tag(tag, names, values, nattr, false); 172 } 173 174 182 protected void tag(String tag, String name, String value, boolean close) { 183 spacing(); 184 m_out.print('<'); 185 m_out.print(tag); 186 m_out.print(' '); 187 m_out.print(name); 188 m_out.print('='); 189 m_out.print('\"'); 190 escapeString(value); 191 m_out.print('\"'); 192 if ( close ) m_out.print('/'); 193 m_out.print('>'); 194 println(); 195 196 if ( !close ) { 197 m_tagStack.add(tag); 198 } 199 } 200 201 208 public void tag(String tag, String name, String value) 209 { 210 tag(tag, name, value, true); 211 } 212 213 220 public void start(String tag, String name, String value) 221 { 222 tag(tag, name, value, false); 223 } 224 225 234 protected void tag(String tag, ArrayList names, ArrayList values, 235 int nattr, boolean close) 236 { 237 spacing(); 238 m_out.print('<'); 239 m_out.print(tag); 240 for ( int i=0; i<nattr; ++i ) { 241 m_out.print(' '); 242 m_out.print((String )names.get(i)); 243 m_out.print('='); 244 m_out.print('\"'); 245 escapeString((String )values.get(i)); 246 m_out.print('\"'); 247 } 248 if ( close ) m_out.print('/'); 249 m_out.print('>'); 250 println(); 251 252 if ( !close ) { 253 m_tagStack.add(tag); 254 } 255 } 256 257 265 public void tag(String tag, ArrayList names, ArrayList values, int nattr) 266 { 267 tag(tag, names, values, nattr, true); 268 } 269 270 278 public void start(String tag, ArrayList names, ArrayList values, int nattr) 279 { 280 tag(tag, names, values, nattr, false); 281 } 282 283 288 public void start(String tag) { 289 tag(tag, (String [])null, null, 0, false); 290 } 291 292 296 public void end() { 297 String tag = (String )m_tagStack.remove(m_tagStack.size()-1); 298 spacing(); 299 m_out.print('<'); 300 m_out.print('/'); 301 m_out.print(tag); 302 m_out.print('>'); 303 println(); 304 } 305 306 314 public void contentTag(String tag, String name, String value, 315 String content) 316 { 317 spacing(); 318 m_out.print('<'); m_out.print(tag); m_out.print(' '); 319 m_out.print(name); m_out.print('='); 320 m_out.print('\"'); escapeString(value); m_out.print('\"'); 321 m_out.print('>'); 322 escapeString(content); 323 m_out.print('<'); m_out.print('/'); m_out.print(tag); m_out.print('>'); 324 println(); 325 } 326 327 333 public void contentTag(String tag, String content) { 334 spacing(); 335 m_out.print('<'); m_out.print(tag); m_out.print('>'); 336 escapeString(content); 337 m_out.print('<'); m_out.print('/'); m_out.print(tag); m_out.print('>'); 338 println(); 339 } 340 341 345 public void content(String content) { 346 escapeString(content); 347 } 348 349 352 public void finish() { 353 m_bias = 0; 354 m_out.flush(); 355 } 356 357 362 public void finish(String footer) { 363 m_bias = 0; 364 m_out.print(footer); 365 m_out.flush(); 366 } 367 368 375 public void spacing() { 376 int len = m_bias + m_tagStack.size() * m_tab; 377 for ( int i=0; i<len; ++i ) 378 m_out.print(' '); 379 } 380 381 384 private static final char LOWER_RANGE = 0x20; 386 private static final char UPPER_RANGE = 0x7f; 387 private static final char[] VALID_CHARS = { 0x9, 0xA, 0xD }; 388 389 private static final char[] INVALID = { '<', '>', '"', '\'', '&' }; 390 private static final String [] VALID = 391 { "<", ">", """, "'", "&" }; 392 393 397 protected void escapeString(String str) { 398 if ( str == null ) { 399 m_out.print("null"); 400 return; 401 } 402 403 int len = str.length(); 404 for (int i = 0; i < len; ++i) { 405 char c = str.charAt(i); 406 407 if ( (c < LOWER_RANGE && c != VALID_CHARS[0] && 408 c != VALID_CHARS[1] && c != VALID_CHARS[2]) 409 || (c > UPPER_RANGE) ) 410 { 411 m_out.print("&#"); 413 m_out.print(Integer.toString(c)); 414 m_out.print(';'); 415 } else { 416 boolean valid = true; 417 for (int j=INVALID.length-1; j >= 0; --j ) 419 { 420 if ( INVALID[j] == c) { 421 valid = false; 422 m_out.print(VALID[j]); 423 break; 424 } 425 } 426 if (valid) { 428 m_out.print(c); 429 } 430 } 431 } 432 } 433 434 } | Popular Tags |