Annotation of FM2SQL/com/exploringxml/xml/Node.java, revision 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>