■
シンプルな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+">"; } */ }