使用JAXB进行XML解组

时间:2013-02-02 05:23:55

标签: java xml jaxb unmarshalling

我有一个XML文件,我试图解组,但我无法弄清楚如何做到这一点。

XML看起来像

<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>

当我将params作为根元素并且没有服务器元素或配置为根元素时,我以前可以解组。

我添加了一个配置类来尝试取消编组,但我不知道我哪里出错了。

我的课程看起来像

@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     
}   

解组代码

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());

println打印0.我哪里出错?

我知道我还没有任何服务器节点的代码,还没有到那里。我的实际XML还没有那个节点,我仍然无法在config标签内正确解组params。

4 个答案:

答案 0 :(得分:2)

您只需进行以下更改即可。将Config中的setParams方法更改为

@XmlElement(name = "params") //<--Annotation added here
public void setParam(Params params) {
    this.params = params;
}

答案 1 :(得分:1)

@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;
          ...
}

答案 2 :(得分:0)

我认为Param和它的包装都应该是不合适的。你只需要清除列表。但Param模型也需要解开。

答案 3 :(得分:0)

默认情况下,JAXB (JSR-222)实现会将所有公共字段和属性视为已映射。属性被识别为具有匹配的get / set方法。您只需将setParam课程中的Config方法更改为setParams即可与getParams方法匹配。

@XmlRootElement
public class Config {

    private Params params = new Params();

    public Params getParams() {
        return params;
    }
    public void setParams(Params params) {
        this.params = params;
    }

}