从我最近的question开始 关于用Java解析XML文件,我决定使用commons-digester库。我现在熟悉这个过程,现在想要创建一个表示XML文件的Java类,这样当用户实例化该类的新对象时,XML文件中的所有数据都将可用。
为了说明这一点,我有一个名为MyConfig.xml的XML文件,其结构如下:
<MyConfig>
<ServerName>nile</ServerName>
<ServerPort>8079</ServerPort>
</MyConfig>
我还有一个名为MyConfig.java的Java类,它代表了这个XML文件。它有一个构造函数,它接受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。
感谢。
答案 0 :(得分:1)
我意识到这不是你问题的直接答案,但对于这样一个简单的配置和你遇到的问题,这是很多代码。正如您在原始帖子中所提到的,简单XML http://simple.sourceforge.net在我看来做得更好。
@Root
public class MyConfig {
@Element
private String serverName;
@Element
private int serverPort
public MyConfig() {
super();
}
public MyConfig(File file) {
Style style = new CamelCaseStyle();
Persister persister = new Persister(style);
persister.read(this, file);
}
public String getServerName() {
return name;
}
public int getServerPort() {
return port;
}
}
用。创建它。
MyConfig mc = new MyConfig("/home/user/MyConfig.xml");
System.out.println("Name: " + mc.getServerName());
System.out.println("Port: " + mc.getServerPort());
完成!你会看到没有例外。此外,对于您的浏览器异常,您缺少public my no arguments constructor,类似于我添加到MyConfig示例中的那些。
答案 1 :(得分:0)
我看了公共消化器已经有一段时间了,但我希望 InstantiationException 是因为消化器期望 MyConfig 类是{{3} }。 JavaBean的一个定义特征是它有一个 public,zero-arg构造函数。
您可能会考虑使用其他类来创建 MyConfig 实例:
public class MyConfigFactory
public MyConfig createMyConfig(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);
MyConfig mc = (MyConfig) digester.parse(new File(configFile));
return mc;
}
}