00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 package org.openmobileis.synchro.openmsp.protocol;
00027
00028 import java.util.Vector;
00029
00030
00039 public class SimpleOpenMLParser {
00040
00041 public SimpleOpenMLParser() {
00042 }
00043
00047 public static ElementData[] parseXML(String xml) {
00048 Vector list = new Vector(5);
00049
00050 int c;
00051 boolean inside = false;
00052 boolean exclamation = false;
00053 int nonParsedTags = 0;
00054 StringBuffer element = new StringBuffer();
00055 StringBuffer pcdata = new StringBuffer();
00056 java.io.ByteArrayInputStream inputXML = new java.io.ByteArrayInputStream(xml.getBytes());
00057 while ((c = inputXML.read())> -1) {
00058 switch ((char) c) {
00059 case '!' :
00060 if (inside)
00061 exclamation = true;
00062 break;
00063 case '<' :
00064 if (inside && !exclamation)
00065 return null;
00066
00067 else if (inside && exclamation) {
00068 nonParsedTags++;
00069 element.append((char)c);
00070 } else {
00071 inside = true;
00072 list.add(new ElementData(element.toString(), pcdata.toString()));
00073 element = new StringBuffer();
00074
00075 }
00076 break;
00077 case '>' :
00078 if (nonParsedTags > 0) {
00079 nonParsedTags--;
00080 element.append((char)c);
00081 } else if (inside) {
00082 if (exclamation)
00083 exclamation = false;
00084 inside = false;
00085
00086
00087 pcdata = new StringBuffer();
00088 } else
00089 return null;
00090
00091 break;
00092 default :
00093 if (inside)
00094 element.append((char)c);
00095 else
00096 pcdata.append((char)c);
00097 break;
00098 }
00099 }
00100
00101 ElementData[] retData = new ElementData[list.size()];
00102 list.toArray(retData);
00103 return retData;
00104
00105
00106
00107
00108 }
00109 }