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

通讯/手机编程

开发平台:

Java

  1. package org.kxml.parser;
  2. import java.io.IOException;
  3. import java.util.*;
  4. import org.kxml.*;
  5. import org.kxml.io.*;
  6. /** A class for events indicating the start of a new element */
  7. public class StartTag extends Tag {
  8.     Vector attributes;
  9.     boolean degenerated;
  10.     PrefixMap prefixMap;
  11.     /** creates a new StartTag. The attributes are not copied and may
  12. be reused in e.g. the DOM. So DO NOT CHANGE the attribute
  13. vector after handing over, the effects are undefined */
  14.     public StartTag (StartTag parent, String namespace, 
  15.      String name, Vector attributes, 
  16.      boolean degenerated, boolean processNamespaces) {
  17. super (Xml.START_TAG, parent, namespace, name);
  18. this.attributes = (attributes == null || attributes.size () == 0) 
  19.     ? null 
  20.     : attributes;
  21. this.degenerated = degenerated;
  22. prefixMap = parent == null ? PrefixMap.DEFAULT : parent.prefixMap;
  23. if (!processNamespaces) return;
  24. boolean any = false; 
  25. for (int i = getAttributeCount () - 1; i >= 0; i--) {
  26.     Attribute attr = (Attribute) attributes.elementAt (i);
  27.     String attrName = attr.getName ();
  28.     int cut = attrName.indexOf (':');
  29.     String prefix;
  30.     if (cut != -1) {
  31. prefix = attrName.substring (0, cut);
  32. attrName = attrName.substring (cut+1);
  33.     }
  34.     else if (attrName.equals ("xmlns")) {
  35. prefix = attrName;
  36. attrName = "";
  37.     } 
  38.     else continue;
  39.     if (!prefix.equals ("xmlns")) {
  40. if (!prefix.equals ("xml")) any = true;
  41.     }
  42.     else {
  43. prefixMap = new PrefixMap (prefixMap, attrName, attr.getValue ());
  44.     
  45. //System.out.println (prefixMap);
  46. attributes.removeElementAt (i);
  47.     }
  48. }
  49. int len = getAttributeCount ();
  50. if (any) {
  51.     for (int i = 0; i < len; i++) {
  52. Attribute attr = (Attribute) attributes.elementAt (i);
  53. String attrName = attr.getName ();
  54. int cut = attrName.indexOf (':');
  55. if (cut == 0) 
  56.     throw new RuntimeException 
  57. ("illegal attribute name: "+attrName+ " at "+this);
  58. else if (cut != -1) {     
  59.     String attrPrefix = attrName.substring (0, cut);
  60.     if (!attrPrefix.equals ("xml")) {
  61. attrName = attrName.substring (cut+1);
  62. String attrNs = prefixMap.getNamespace (attrPrefix);
  63. if (attrNs == null) 
  64.     throw new RuntimeException 
  65. ("Undefined Prefix: "+attrPrefix + " in " + this);
  66. attributes.setElementAt 
  67.     (new Attribute (attrNs, 
  68.     attrName, attr.getValue ()), i);
  69.     }
  70. }
  71.     }
  72. }
  73. int cut = name.indexOf (':');
  74. String prefix;
  75. if (cut == -1) prefix = "";
  76. else if (cut == 0)
  77.     throw new RuntimeException 
  78. ("illegal tag name: "+ name +" at "+this);
  79. else {
  80.     prefix = name.substring (0, cut);
  81.     this.name = name.substring (cut+1);
  82. }
  83. this.namespace = prefixMap.getNamespace (prefix);
  84. if (this.namespace == null) {
  85.     if (prefix.length () != 0) 
  86. throw new RuntimeException 
  87.     ("undefined prefix: "+prefix+" in "+prefixMap +" at "+this);
  88.     this.namespace = Xml.NO_NAMESPACE;
  89. }
  90.     }
  91.     /** returns the attribute vector. May return null for no attributes. */
  92.     public Vector getAttributes () {
  93. return attributes;
  94.     }
  95.     public boolean getDegenerated () {
  96. return degenerated;
  97.     }
  98.     public PrefixMap getPrefixMap () {
  99. return prefixMap;
  100.     }
  101.     /** Simplified (!) toString method for debugging
  102. purposes only. In order to actually write valid XML,
  103.         please use a XmlWriter. */
  104.     public String toString () {
  105. return "StartTag <"+name+"> line: "+lineNumber+" attr: "+attributes;
  106.     }
  107.    
  108.     public void setPrefixMap (PrefixMap map) {
  109. this.prefixMap = map;
  110.     }
  111.    
  112. }