シンプルなXMLのパーサを作ってみました。
単独タグ、通常タグ、アトリビュート、文字列のみ対応です。
コメント、CDATAセクション、等は対応してません。


使い方は

X.p = 0; // 初期化
X x = new X("<xml da=\"yo\">aiu<eo/></xml>")

というかんじで。

javac -source 1.2 -target 1.1 -g:none X.java

で、1,349byteです。携帯用のシンプルなXMLパーサ欲しいって場合に使えると思います。


以下ソース

import java.util.*;
class X{
	public String name;
	public Hashtable attr;
	public Vector childs;
	public static int p;
	public X(){}
	public X(String s) throws Error {
		char[] str = s.toCharArray();
		int start = p;
		if (str[p] != '<') {
			// テキストだ!!
			for(;p<str.length && str[p] != '<';p++);
			name = new String(str, start, p-start);
			return;
		}
		p++;
		attr = new Hashtable();
		// タグだ!!
		char c;
		for(;;p++) {
			c=str[p];
			if(Character.isSpace(c) || c=='>' || c=='/') break;
		}
		name = new String(str, start+1, p-start-1);
		// アトリビュートループ
		for(;;) {
			c = skip(str);
			if(c=='/') {
				p++;
				if (str[p++] != '>') throw new Error();
				return;
			}
			if(c=='>') break;
			start = p;
			// スペースか、=までは名前
			for(;;p++){
				c=str[p];
				if(Character.isSpace(c) || c=='=')break;
			}
			String aname = new String(str,start,p-start);
			if (skip(str) != '=') throw new Error();
			p++;
			if (skip(str) != '\"') throw new Error();
			start = ++p;
			for(;;p++){
				c=str[p];
				if(c=='"')break;
			}
			String v = new String(str,start,p-start);
			attr.put(aname, v);
			p++;
		}
		p++;
		// 子だ!
		childs = new Vector();
		for(;;) {
			c = str[p];
			if (c == '<' && str[p+1] == '/') {
				// 終了タグだ!!
				start = p+=2;
				for(;;p++){
					c=str[p];
					if(c=='>')break;
				}
				if(name.equals(new String(str,start,p-start))){
					p++;
					return;
				}
				throw new Error();
			}
			childs.addElement(new X(s));
		}
	}
	private final char skip(char[] str) {
		// スペースをスキップ
		for(;;p++) {
			char c=str[p];
			if(!Character.isSpace(c)) return c;
		}
	}
/*	public String toString() {
		String as = name;
		String cs = "";
		if(attr == null) return name;
		for (Enumeration e = attr.keys(); e.hasMoreElements();){
			Object n = e.nextElement();
			as += " " + n.toString() + "=\"" + attr.get(n).toString() +"\"";
		}
		if(childs == null) return "<"+as+cs+"/>";
		for(Enumeration e = childs.elements(); e.hasMoreElements();)
			cs += e.nextElement();
		return "<"+as+">"+cs+"</"+name+">";
	}
*/
}