I have an XML file that I'm trying to unmarshal, but I cant figure out how to do it.
XML looks like
<config>
<params>
<param>
<a>draft</a>
<b>Serial</b>
</param>
<param>
<a>amt</a>
<b>Amount</b>
</param>
</params>
<server>
<scheme>http</scheme>
<host>somehost.com/asdf</host>
</server>
</config>
I could previously unmarshall when I had params as the root element and didnt have the server elements or config as root element.
I added a config class to try to unmarshall this, but I dont know where I'm going wrong.
My classes look like
@XmlRootElement
public class Config {
private Params params = new Params();
@XmlElement(name="params")
public Params getParams() {
return params;
}
public void setParam(Params params) {
this.params = params;
}
}
public class Params {
private List<Param> params = new ArrayList<Param>();
public List <Param> getParam() {
return params;
}
public void setParam(List<Param> params) {
this.params = params;
}
}
public class Param {
String a;
String b;
//getters and setters. omitted for brevity
}
unmarshal code
File file = new File("C:\\config.xml");
InputStream inputStream = new FileInputStream(file);
JAXBContext jc = JAXBContext.newInstance(Config.class);
Unmarshaller u = jc.createUnmarshaller();
conf = (Config) u.unmarshal(file);
System.out.println(conf.getParams().getParam().size());
the println prints 0. Where did I go wrong?
I know I dont have any code for the server nodes yet, havent gotten there yet. My actual XML doesnt have that node yet and I still cant get it to unmarshall the params correctly when inside the config tag.
You just need to do following changes and it will work. Change setParams method in Config to
@XmlElement(name = "params") //<--Annotation added here
public void setParam(Params params) {
this.params = params;
}
try
@XmlRootElement
class Config {
private List<Param> params = new ArrayList<Param>();
@XmlElementWrapper
@XmlElement(name="param")
public List<Param> getParams() {
return params;
}
public void setParams(List<Param> params) {
this.params = params;
}
}
class Param {
String a;
String b;
...
}
I think both Param and it's wrapper should be unmarsh. You just unmarsh the list.But the Param model is also need to be unmarshed.
By default a JAXB (JSR-222) implementation will treat all public fields and properties as mapped. A property is recognized as having matching get
/set
methods. You just need to change the setParam
method in the Config
class to setParams
to match the getParams
method.
@XmlRootElement
public class Config {
private Params params = new Params();
public Params getParams() {
return params;
}
public void setParams(Params params) {
this.params = params;
}
}
来源:https://stackoverflow.com/questions/14658921/xml-unmarshalling-using-jaxb