うお、もう仕事、行かないと。
番兵君をたくさん置いて、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バイトまで縮みました。