Annotation of FM2SQL/com/exploringxml/xml/Node.java, revision 1.1.1.1

1.1       rogo        1: /* Copyright (c) 2000 Michael Claßen <mclassen@internet.com>
                      2:  *
                      3:  * This program is free software; you can redistribute it and/or
                      4:  * modify it under the terms of the GNU General Public License
                      5:  * as published by the Free Software Foundation; either version 2
                      6:  * of the License, or (at your option) any later version.
                      7:  *
                      8:  * This program is distributed in the hope that it will be useful,
                      9:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
                     10:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     11:  * GNU General Public License for more details.
                     12:  *
                     13:  * You should have received a copy of the GNU General Public License
                     14:  * along with this program; if not, write to the Free Software
                     15:  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
                     16:  *
                     17:  * $Id: Node.java,v 1.2 2001/01/05 19:32:05 classen Exp $
                     18:  */
                     19: 
                     20: package com.exploringxml.xml;
                     21: 
                     22: import java.util.Hashtable;
                     23: 
                     24: /**
                     25:  * A node of an XML DOM tree;
                     26:  *
                     27:  * @author    Michael Claßen
                     28:  * @version   $Revision: 1.2 $
                     29:  */
                     30: public class Node {
                     31: 
                     32:   public String type;
                     33:   public String name;
                     34:   public String value;
                     35:   public Hashtable attributes;
                     36:   public int uid;
                     37:   public JSArray contents;
                     38:   public JSArray index;
                     39: 
                     40:   // node types
                     41:   static final String Element = "element";
                     42:   static final String CharData = "chardata";
                     43:   static final String PI = "pi";
                     44:   static final String Comment = "comment";
                     45: 
                     46: /////////////////////////
                     47: //// the object constructors for the hybrid DOM
                     48: 
                     49:   /**
                     50:    * factory method for element nodes
                     51:    *
                     52:    * @return    a Node of type element
                     53:    */
                     54:   static Node createElement() {
                     55:     Node n = new Node();
                     56:    n.type = Element;
                     57:      n.name = new String();
                     58:    n.attributes = new Hashtable();
                     59:      n.contents = new JSArray();
                     60:    n.uid = Xparse.count++;
                     61:      Xparse.index.setElementAt(n, n.uid);
                     62:     return n;
                     63:   }
                     64: 
                     65:   /**
                     66:    * factory method for the root element
                     67:    *
                     68:    * @return    a rootelement Node
                     69:    */
                     70:   static Node createRootelement() {
                     71:     return createElement();
                     72:   }
                     73: 
                     74:   /**
                     75:    * factory method for chardata nodes
                     76:    *
                     77:    * @return    a chardata Node
                     78:    */
                     79:   static Node createChardata() {
                     80:     Node n = new Node();
                     81:    n.type = CharData;
                     82:      n.value = new String();
                     83:     return n;
                     84:   }
                     85: 
                     86:   /**
                     87:    * factory method for PI nodes
                     88:    *
                     89:    * @return    a PI Node
                     90:    */
                     91:   static Node createPi() {
                     92:     Node n = new Node();
                     93:      n.type = PI;
                     94:    n.value = new String();
                     95:     return n;
                     96:   }
                     97: 
                     98:   /**
                     99:    * factory method for comment nodes
                    100:    *
                    101:    * @return    a comment Node
                    102:    */
                    103:   static Node createComment()
                    104:   {
                    105:     Node n = new Node();
                    106:      n.type = Comment;
                    107:    n.value = new String();
                    108:     return n;
                    109:   }
                    110: 
                    111:   /**
                    112:    * returns the character data in the first child element;
                    113:    * returns nonsense if the first child element ist not chardata
                    114:    *
                    115:    * @return    the characters following an element
                    116:    */
                    117:   public String getCharacters() {
                    118:     if(contents.v.isEmpty())
                    119:     return ""; else
                    120:     return ((Node)contents.elementAt(0)).value;
                    121:   }
                    122: 
                    123:   /**
                    124:    * find the node matching a certain occurrence of the path description
                    125:    *
                    126:    * @param     path an XPath style expression without leading slash
                    127:    * @param     occur array indicating the n'th occurrence of a node matching each simple path expression
                    128:    *
                    129:    * @return    the n'th Node matching the path description
                    130:    */
                    131:   public Node find(String path, int[] occur) {
                    132:     Node n = this;
                    133:     JSArray a = new JSArray();
                    134:     a.split(path, "/");
                    135:     int i = 0;
                    136:     while (i < a.length()) {
                    137:       n = findChildElement(n, (String)a.elementAt(i), occur[i]);
                    138:       if (n == null) return null;
                    139:       i++;
                    140:     }
                    141:     return n;
                    142:   }
                    143: 
                    144:   /**
                    145:    * find the child node matching a certain occurrence of a simple path description
                    146:    *
                    147:    * @param     parent the parent node to start from
                    148:    * @param     simplePath one element of an XPath style expression
                    149:    * @param     occur the n'th occurance of a node matching the path expression
                    150:    *
                    151:    * @return    the n'th child Node matching the simple path description
                    152:    */
                    153:   Node findChildElement(Node parent, String simplePath, int occur) {
                    154:     JSArray a = parent.contents;
                    155:     Node n;
                    156:     int  found = 0;
                    157:     int i = 0;
                    158:     String tag;
                    159:     do {
                    160:       n = (Node)a.elementAt(i);
                    161:       ++i;
                    162:       tag = (n.name != null) ? n.name : "";
                    163:       int colonPos = tag.indexOf(':');
                    164:       tag = (colonPos == -1) ? tag : tag.substring(colonPos + 1);
                    165:       if (simplePath.equals(tag)) ++found;
                    166:     } while (i < a.length() && found < occur);
                    167:     return (found == occur) ? n : null;
                    168:   }
                    169: 
                    170: }
                    171: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>