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

通讯/手机编程

开发平台:

Java

  1. /* kXML
  2.  *
  3.  * The contents of this file are subject to the Enhydra Public License
  4.  * Version 1.1 (the "License"); you may not use this file except in
  5.  * compliance with the License. You may obtain a copy of the License
  6.  * on the Enhydra web site ( http://www.enhydra.org/ ).
  7.  *
  8.  * Software distributed under the License is distributed on an "AS IS"
  9.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  10.  * the License for the specific terms governing rights and limitations
  11.  * under the License.
  12.  *
  13.  * The Initial Developer of kXML is Stefan Haustein. Copyright (C)
  14.  * 2000, 2001 Stefan Haustein, D-46045 Oberhausen (Rhld.),
  15.  * Germany. All Rights Reserved.
  16.  *
  17.  * Contributor(s): Paul Palaszewski, Wilhelm Fitzpatrick, 
  18.  *                 Eric Foster-Johnson, Daniel Feygin,  Scott Daub
  19.  *
  20.  * */
  21. package org.kxml.parser;
  22. import java.io.IOException;
  23. import java.util.*;
  24. import org.kxml.*;
  25. import org.kxml.io.*;
  26. /** An abstract base class for the XML and WBXML parsers. Of course,
  27.     you can implement your own subclass with additional features,
  28.     e.g. a validating parser.  */
  29. public abstract class AbstractXmlParser {
  30.     
  31.     protected boolean processNamespaces = true;
  32.     /** Ignores a tree */
  33.     public void ignoreTree () throws IOException {
  34. readTree (null);
  35.     }
  36.     /** Reads a complete element tree to the given event
  37. Vector. The next event must be a start tag. */
  38.     public void readTree (Vector buf) throws IOException { 
  39. StartTag start = (StartTag) read ();
  40. //if (buf != null) buf.addElement (start); [caused duplication, fixed by SD]
  41. while (true) {
  42.     ParseEvent event = peek ();
  43.     if (buf != null) buf.addElement (event);
  44.     switch (event.getType ()) {
  45.     case Xml.START_TAG:
  46. readTree (buf);
  47. break;
  48.     case Xml.END_TAG:
  49.     case Xml.END_DOCUMENT:
  50. read ();
  51. return;
  52.     default: 
  53. read ();
  54.     }
  55. }
  56.     }
  57.     /** Returns the current line number; -1 if unknown. Convenience
  58.         method for peek ().getLineNumber (). */
  59.     public int getLineNumber () throws IOException {
  60. return peek ().getLineNumber ();
  61.     }
  62.     /** reads the next event available from the parser. If the end of
  63.        the parsed stream has been reached, null is returned.  */
  64.     public abstract ParseEvent read () throws IOException;
  65.     /** Reads an event of the given type. If the type is START_TAG or
  66. END_TAG, namespace and name are tested, otherwise
  67. ignored. Throws a ParseException if the actual event does not
  68. match the given parameters. */
  69.     public ParseEvent read (int type, String namespace, 
  70.     String name) throws IOException {
  71. if (peek (type, namespace, name)) 
  72.     return read ();
  73. else throw new ParseException 
  74.     ("unexpected: "+peek (), null,  
  75.      peek().getLineNumber (), -1);
  76.     }
  77.     public boolean peek (int type, String namespace, 
  78.  String name) throws IOException {
  79.  
  80. ParseEvent pe = peek ();
  81. return pe.getType () == type 
  82.     && (namespace == null || namespace.equals (pe.getNamespace ()))
  83.     && (name == null || name.equals (pe.getName ()));
  84.     }
  85.     /** Convenience Method for skip (Xml.COMMENT | Xml.DOCTYPE 
  86. | Xml.PROCESSING_INSTRUCTION | Xml.WHITESPACE) */
  87.     public void skip () throws IOException { 
  88. while (true) {
  89.     int type = peek ().type;
  90.     if (type != Xml.COMMENT 
  91. && type != Xml.DOCTYPE 
  92. && type != Xml.PROCESSING_INSTRUCTION 
  93. && type != Xml.WHITESPACE) break;
  94.     read ();
  95. }
  96.     } 
  97.     /** reads the next event available from the parser
  98. without consuming it */
  99.     public abstract ParseEvent peek () throws IOException;
  100.     /** tells the parser if it shall resolve namespace prefixes to
  101. namespaces. Default is true */
  102.     public void setProcessNamespaces (boolean processNamespaces) {
  103. this.processNamespaces = processNamespaces;
  104.     }
  105.     
  106.     /** Convenience method for reading the content of text-only 
  107.         elements. The method reads text until an end tag is
  108.         reached. Processing instructions and comments are
  109. skipped. The end tag is NOT consumed.  The concatenated text
  110.         String is returned. If the method reaches a start tag, an
  111.         Exception is thrown. */
  112.     
  113.     public String readText () throws IOException {
  114. StringBuffer buf = new StringBuffer ();
  115. while (true) {
  116.     ParseEvent event = peek ();
  117.     switch (event.getType ()) {
  118.     case Xml.START_TAG:
  119.     case Xml.END_DOCUMENT:
  120.     case Xml.DOCTYPE:
  121. throw new RuntimeException 
  122.     ("Illegal event: "+event);
  123.     case Xml.WHITESPACE:
  124.     case Xml.TEXT:
  125. read ();
  126. buf.append (event.getText ());
  127. break;
  128.     case Xml.END_TAG:
  129. return buf.toString ();
  130.     default:
  131. read ();
  132.     }
  133. }
  134.     }
  135. }