うお、もう仕事、行かないと。

番兵君をたくさん置いて、XMLの短いバージョンのパーサだけ作ってみた。

class dom{
	char[] name;
	char[][char[]] attr;
	dom[] childs;
	int id;
	void parse(char[] str) {
		char c;
		while((c = str[id++]) != 0) {
			name ~= c;
		}
		// attrs 
		while((c = str[id++]) != 0) {
			char[] aname = "";
			char[] value = "";
			do {
				aname ~= c;
			} while((c = str[id++]) != 0);
			
			while((c = str[id++]) != 0) {
				value ~= c;
			}
			attr[aname] = value;
		}

		// childs
		while((c = str[id++]) != 0) {
			dom d = new dom();
			childs ~= d;
			switch(c) {
			case '<': d.id = id; d.parse(str); id = d.id; break;
			case 't': 
				while((c = str[id++]) != 0) {
					d.name ~= c;
				}
			}
		}

	}
	char[] toString(){
		if (id) {
			char[] as;
			char[] cs;
			foreach(char[] n,char[] k; attr) {
				as ~= " " ~ n ~ "=\"" ~ k ~"\"";
			}
			for(int i = 0; i < childs.length; i++) {
				cs ~= childs[i].toString();
			}
			return "<"~name~as~">"~cs~"</"~name~">";
		} else {
			return name;
		}
	}
}

void test(char[] str) {
	dom d;
	d = new dom();
	d.parse(str);
	printf("%.*s\n", d.toString());
}
void main() {
	test("a\0name\0value\0n2\0v2\0\0\0");
	test("a\0name\0value\0n2\0v2\0\0" ~"<b\0n3\0v3\0n4\0v4\0\0\0"~"\0");
	test("a\0name\0value\0n2\0v2\0\0" ~"<b\0n3\0v3\0n4\0v4\0\0\0"~"<c\0n5\0v5\0n6\0v6\0\0\0"~ "\0");
}

これは、Dバージョン。Javaバージョンは作りかけ。

import java.util.Vector;
import java.util.Hashtable;
import java.util.Enumeration;

public class Dom{
	public String name;
	public Hashtable attr = new Hashtable();
	public Vector childs = new Vector();
	public static int p;

	private final String g(char[] str) {
		int start = p;
		for(;str[p++] != 0;) {}
		return new String(str, start, p-1-start);
	}

	public Dom(String s) {
		char[] str = s.toCharArray();
		name = g(str);
		for(;str[p] != 0;) attr.put(g(str), g(str));
		p++;
		for(char c;(c = str[p++]) != 0;) 
			childs.addElement(c=='<' ? (Object)new Dom(s) : (Object)g(str));
	}
/*
	public String toString() {
		String as = name;
		String cs = ">";
		for (Enumeration e = attr.keys(); e.hasMoreElements();){
			Object n = e.nextElement();
			as += " " + n.toString() + "=\"" + attr.get(n).toString() +"\"";
		}
		for(Enumeration e = childs.elements(); e.hasMoreElements();)
			cs += e.nextElement();
		return "<"+as+cs+"</"+name+">";
	}

	static void test(String str) {
		Dom.p = 0;
		Dom d = new Dom(str);
		System.out.println( d.toString());
	}
	public static void main(String[] argv) {
		test("a\0name\0value\0n2\0v2\0\0\0");
		test("a\0name\0value\0n2\0v2\0\0" + "<b\0n3\0v3\0n4\0v4\0\0\0" + "\0");
		test("a\0name\0value\0n2\0v2\0\0" + "<b\0n3\0v3\0n4\0v4\0\0\0" + "<c\0n5\0v5\0n6\0v6\0\0\0" + "\0");
	}
*/
}

797バイトまで縮みました。