Java での XML ファイルの解析に関する最近の質問を受けて 、commons-digester ライブラリを使用することにしました。このプロセスに慣れてきたので、XML ファイルを表す Java クラスを作成して、ユーザーがそのクラスの新しいオブジェクトをインスタンス化したときに、XML ファイルのすべてのデータを使用できるようにしたいと考えています。
これを説明するために、次の構造を持つ MyConfig.xml という XML ファイルがあります。
<MyConfig>
<ServerName>nile</ServerName>
<ServerPort>8079</ServerPort>
</MyConfig>
この XML ファイルを表す MyConfig.java という Java クラスもあります。XML ファイルの場所を取得し、XML ファイルの内容を解析して出力するコンストラクターがあります。クラスの構造は次のとおりです。
package com.digestersample;
import java.io.File;
import java.io.IOException;
import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;
public class MyConfig {
private String serverName;
private String serverPort;
public MyConfig(String configFile) throws IOException, SAXException
{
Digester digester = new Digester();
digester.setValidating(false);
digester.addObjectCreate("MyConfig", MyConfig.class);
digester.addCallMethod("MyConfig/ServerName", "setServerName", 0);
digester.addCallMethod("MyConfig/ServerPort", "setServerPort", 0);
System.out.println("Creating MyConfig...");
MyConfig mc = (MyConfig) digester.parse(new File(configFile));
System.out.println("Done.");
System.out.println("Port: " + mc.getServerName());
System.out.println("Port: " + mc.getServerPort());
}
public String getServerName() {
return serverName;
}
public void setServerName(String serverName) {
this.serverName = serverName;
}
public String getServerPort() {
return serverPort;
}
public void setServerPort(String serverPort) {
this.serverPort = serverPort;
}
}
私の質問は、他のコンポーネントがクラスの新しいオブジェクトをインスタンス化するたびに、XML ファイルの内容がインスタンスで利用できるように、このクラスを変更するにはどうすればよいかということです。例えば:
package com.digestersample;
import java.io.IOException;
import org.xml.sax.SAXException;
public class MyOtherClass {
public static void main(String[] args) {
MyConfig mc;
try {
mc = new MyConfig("/home/user/MyConfig.xml");
System.out.println( mc.getServerName() );
System.out.println( mc.getServerPort() );
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
}
現時点では、上記のインスタンス化によって java.lang.InstantiationException が発生します。
ありがとう。