2013-07-15 87 views
3

我有以下XML文件來解讀問題,同時解組使用JAXB

<root> 
    <emp>Google</emp> 
    <emp>Yahoo</emp> 
    <xyz>random</xyz> 
</root> 

,我有下列方式使用註釋,

@XmlRootElement(name = "root") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class abc { 

    @XmlElement(name = "emp") 
    private String emp1; 
    @XmlElement(name = "emp") 
    private String emp2; 
    @XmlElement(name = "xyz") 
    private String xyz; 
    // added getters and setters for these fields 
} 

我的問題是而我試圖讓

obj.getEmp1(); // result is Yahoo instead of Google 
    obj.getEmp2(); // result is null. 

請澄清我,我做錯了什麼?

回答

2

如果因任何原因,你不能使用莫西,另一種解決方案是將emp元素映射爲一個列表

@XmlRootElement(name = "root") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class abc { 
    @XmlElement(name = "emp") 
    private List<String> emp; 
    @XmlElement(name = "xyz") 
    private String xyz; 
    // added getters and setters for these fields 
} 

然後用下面的代碼來獲取值:

obj.getEmp().get(0); 
obj.getEmp().get(1); 

Blaise's solution更優雅


你可以有一個String[]場,有你當前訪問方法訪問String[]

import javax.xml.bind.annotation.*; 

@XmlRootElement(name = "root") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class abc { 

    private String[] emp = new String[2]; 
    private String xyz; 

    public String getEmp1() { 
     return emp[0]; 
    } 

    public void setEmp1(String emp1) { 
     this.emp[0] = emp1; 
    } 

    public String getEmp2() { 
     return emp[1]; 
    } 

    public void setEmp2(String emp2) { 
     this.emp[1] = emp2; 
    } 

    public String getXyz() { 
     return xyz; 
    } 

    public void setXyz(String xyz) { 
     this.xyz = xyz; 
    } 

} 
+0

+1 - 我希望你不介意,但是我對你的答案做了一個編輯,這個答案建立在引入一個List屬性的基礎上。更新是通過一個'String []'字段來實現的,但是保持get/set方法不成問題。 –

+0

它解決了我的問題。謝謝@mavroprovato! – Rajesh

0

這可能工作。

<root> 
    <emp1>Google</emp1> 
    <emp2>Yahoo</emp2> 
    <xyz>random</xyz> 
</root> 

@XmlRootElement(name = "root") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class abc { 

    @XmlElement(name = "emp1") 
    private String emp1; 
    @XmlElement(name = "emp2") 
    private String emp2; 
    @XmlElement(name = "xyz") 
    private String xyz; 
} 
+0

是@ram但我沒有權利更改XML在我的情況! – Rajesh

4

注:我是EclipseLink JAXB (MOXy)鉛和JAXB (JSR-222)專家小組的成員。

標準JAXB(JSR-222)註釋不支持將2個不同的屬性映射到同一個XML元素。

您可以在此用例中使用EclipseLink JAXB(MOXy)的@XmlPath擴展。

import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement(name = "root") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class abc { 

    @XmlPath("emp[1]/text()") 
    private String emp1; 
    @XmlPath("emp[2]/text()") 
    private String emp2; 
    @XmlElement(name = "xyz") 
    private String xyz; 

    // added getters and setters for these fields 
} 

更多信息

+0

喜歡這個筆記。 :) –

+0

我們可以在Netbeans IDE或Eclipse插件中使用相同的東西嗎?請澄清一下? – Rajesh

+0

@Rajesh - EclipseLink JAXB(MOXy)是符合JAXB(JSR-222)標準的實現。要使用它,只需將它放在類路徑中,並在與指定它爲提供者的域模型相同的包中指定一個'jaxb.properties'文件:http://blog.bdoughan.com/2011/05/specifying -eclipselink-moxy-as-your.html –