このような基本的な要件を備えたフレームワークの必要性はわかりませんが、それでもあなたのニーズを完全には理解していない可能性があります. 最初は、SAX 解析ハンドラーのような単純なものから始めます。完全に手作業でコーディングされ、テストされていませんが、基本的な考え方については、次を参照してください。
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
class XmlHandler extends DefaultHandler {
Map msgClasses = new HashMap(){{ put("uniqueAttribute1", "Foo"); put("someStuff", "Bar"); }};
public MessageBase messageFromAttributes(final org.xml.sax.Attributes attributes) {
for(int i=0; i<attributes.getLength(); i++) {
if(msgClasses.contains(attributes.getValue(i))) {
try{
Class msgClass = Class.forName(attributes.getValue(i));
return msgClass.newInstance();
} catch(ClassNotFoundException e) {
return null;
}
}
}
}
@Override
public final void startElement(String uri, String localName, String name,
final org.xml.sax.Attributes attributes) throws SAXException {
if (localName.equals("msg")) {
MessageBase message = messageFromAttributes(attributes);
}
}
@Override
public final void endElement(String uri, String localName, String name) throws SAXException {
if (localName.equals("msg")) {
}
}
}
上記の例の考え方は、クラス名を特定の属性にマップし、SAX 解析イベントのインスタンス化を処理しながら、正しいクラス名を指すマッピング内の特定の属性を見つけることです。この時点で、リフレクションを使用してクラスをインスタンス化し、続行できます。必要に応じて、残りの属性値を使用してクラスを設定することもできます。