2013-02-02 117 views
2

我有一個XML文件,我試圖解組,但我不知道該怎麼做。使用JAXB的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.1在哪裏我會錯呢?

我知道我沒有服務器節點的任何代碼,還沒有得到那裏。我的實際XML沒有那個節點,我仍然無法在配置標籤中正確解開params。

回答

2

你只需要做以下的改變,它會工作。更改setParams在配置方法

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

這工作,謝謝! – mav

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; 
      ... 
} 
+0

我認爲這會奏效。謝謝! – mav

+0

+1 - 順便說一句,我從'@ XmlElementWrapper'註釋中移除了'name =「params」'部分,因爲JAXB將默認應用該名稱。 –

0

我認爲無論帕拉姆和它的包裝應該是unmarsh。您只需取消清單。但Param模型也需要解開。

+0

您的建議與@Evgeniy Dorofeev相同嗎? – mav

+0

'@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) class Param { String a; String b; ... }'@ user2034573 – xff1874

+0

我嘗試添加,並得到與以前相同的結果。 – mav

0

默認情況下爲映射一個JAXB (JSR-222)實現將把所有的公共字段和屬性。物業被認爲具有匹配get/set方法。您只需將Config類中的setParam方法更改爲setParams以匹配getParams方法。

@XmlRootElement 
public class Config { 

    private Params params = new Params(); 

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

}