AbstractXmlWriter.java
上传用户:haojie1228
上传日期:2022-08-08
资源大小:347k
文件大小:4k
源码类别:

通讯/手机编程

开发平台:

Java

  1. package org.kxml.io;
  2. import java.io.*;
  3. import java.util.*;
  4. import org.kxml.*;
  5. /** An abstract XmlWriter including namespace handling. */
  6. public abstract class AbstractXmlWriter extends Writer {
  7.     protected State current = 
  8. new State (null, 
  9.    PrefixMap.DEFAULT, //null, null, 
  10.    null);
  11.     
  12.     
  13.     
  14.     /** writes an attribute. Only allowed immediately after
  15.         startTag or attribute.  */
  16.     
  17.     public abstract void attribute (String name, 
  18.     String value) throws IOException;
  19.     
  20.     
  21.     
  22.     /** writes an attribute with the given namespace. Only allowed
  23. immediately after startTag or another attribute
  24. call. */
  25.     public void attribute (String namespace, 
  26.    String name, 
  27.    String value) throws IOException {
  28. if (namespace == null || "".equals (namespace))
  29.     attribute (name, value);
  30. else {
  31.     String prefix = current.prefixMap.getPrefix (namespace);
  32.     if (prefix == null || prefix.equals ("")) {
  33. int cnt = 0;
  34. do {
  35.     prefix = "p"+(cnt++);
  36. }
  37. while (current.prefixMap.getNamespace (prefix) != null);
  38. current.prefixMap = new PrefixMap 
  39.     (current.prefixMap, prefix, namespace);
  40. attribute ("xmlns:"+prefix, namespace);
  41.     }
  42.     attribute (prefix + ":" + name, value);
  43. }
  44.     }
  45.     
  46.     public PrefixMap getPrefixMap () {
  47. return current.prefixMap;
  48.     }
  49.     
  50.     /** writes a start tag with the given name, using the given prefix
  51.         map.  This method cares about the namespace prefixes and calls
  52.         startTag (PrefixMap prefixMap, String tag) for concrete
  53.         writing. */
  54.     
  55.     public void startTag (PrefixMap prefixMap,
  56.   String namespace, 
  57.   String name) throws IOException {
  58. // check if namespace is default. 
  59. if (prefixMap == null) prefixMap = current.prefixMap;
  60. if (namespace == null) namespace = "";
  61. String prefix = prefixMap.getPrefix (namespace);
  62. if (prefix == null) { 
  63.     //System.out.println ("namespace "+namespace +" not found in "+prefixMap);
  64.     
  65.     prefixMap = new PrefixMap (prefixMap, "", namespace);
  66.     prefix = "";
  67. }
  68. String tag = prefix.length () == 0 
  69.     ? name
  70.     : prefix + ':' + name;
  71. PrefixMap oldMap = current.prefixMap;
  72. startTag (prefixMap, tag);
  73. // if namespace has changed, write out changes...
  74. if (prefixMap != oldMap) {
  75.     PrefixMap current = prefixMap;
  76.     do {
  77. String p2 = current.getPrefix ();
  78. String ns = current.getNamespace ();
  79. if (prefixMap.getNamespace (p2).equals (ns)
  80.     && !ns.equals (oldMap.getNamespace (p2)))
  81.     attribute (p2.equals ("") ? "xmlns" : ("xmlns:"+p2), ns);
  82. current = current.getPrevious ();
  83.     }
  84.     while (current != null && current != oldMap);
  85. }
  86.     }
  87.     
  88.     
  89.     /** writes a start tag with the given namespace and name */
  90.     
  91.     public void startTag (String namespace, 
  92.   String name) throws IOException {
  93. startTag (null, namespace, name);
  94.     }
  95.     
  96.     
  97.     /** convenience method for startTag (Xml.NO_NAMESPACE, name) */
  98.     
  99.     public void startTag (String name) throws IOException {
  100. startTag (null, Xml.NO_NAMESPACE, name);
  101.     }
  102.     /** abstract method that must be overwritten by
  103. a method actually writing the resolved start tag 
  104. without namespace checking. This implementation
  105.         just puts the state on the stack.<br /><br />
  106.         
  107.         Attention: The actual implementation include the
  108. following line in order to 
  109.         put the current State on the stack!<br /><br />
  110. current = new State (current, prefixMap, tag);
  111.     */
  112.     protected abstract void startTag (PrefixMap prefixMap, 
  113.       String tag) throws IOException;   
  114.     /** Abstract method for writing an end tag.  <b>Attention:</b>
  115. Concrete implementations must pop the previous stack from the
  116. stack:<br /><br />
  117. current = current.prev; */
  118.     public abstract void endTag () throws IOException;
  119.     /** writes Xml.DOCTYPE, Xml.PROCESSING_INSTRUCTION or Xml.COMMENT */
  120.     public abstract void writeLegacy (int type, 
  121.       String text) throws IOException;
  122. }