2012-08-16 69 views
1

我有關於將XML轉換爲Java對象的問題,在這裏我使用JAXB。
在我的情況:如何自定義JAXBContext Unmarshaller複雜的情況下

XML數據:XML數據的

<persons> 
    <person> 
    <name>Aris Tonar</name> 
    <age /> 
    <nickname /> 
    <saldo /> 
    </person> 
</persons> 

JAVA CLASS:

public class Person{ 
    private String name; 
    private Integer age; 
    private String nickName; 
    private Integer id; 
    private Double saldo; 

    /** 
    *Setter and Getter 
    */ 

} 

,當我使用標準的JAXBContext Unmarshaller的代碼,它解析爲Java對象。與代碼:

JAXBContext context = JAXBContext.newInstance(Person.class.getPackage().getName()); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
JAXBElement element = (JAXBElement) unmarshaller.unmarshal(new StreamSource(new StringReader(stringOfXmlData.toString()))); 
Person obj = (Person) element.getValue(); 

它會給結果: 人名= 「阿里斯Tonar」
人年齡= NULL
人暱稱= 「」
人物ID = NULL
人saldo = NULL

但不是那個結果我想要的,我想JAXB會給出結果:

Person name =「Aris Tonar」
人年齡= 0
人暱稱= 「」
人物ID = NULL
人saldo = 0

  1. 我想這在XML數據中聲明的每一個元素會:它是否值指定JAXB會解釋它是正常的(如名稱元素),但如果它的值沒有指定jaxb會將其解釋爲默認值(如年齡,暱稱,saldo元素)
  2. 如果元素未在XML數據中聲明,則jaxb會將其解釋爲null。 (如id元素)

是否有可能我做了嗎?可能會自定義JAXBContext代碼?

回答

3
@XmlType(name = "person", propOrder = {"name", "age", "nickName" , "saldo"}) 
public class Person { 

private String name; 
private Integer age; 
private String nickName; 
private Integer id; 
private Double saldo; 

public Person(String name, Integer age, String nickName, Integer id, Double saldo) { 
    this.name = name; 
    this.age = age; 
    this.nickName = nickName; 
    this.id = id; 
    this.saldo = saldo; 
} 

public Person() { 
    //jaxb constructor 
} 

@XmlElement(defaultValue="0") 
public Integer getAge() { 
    return age; 
} 

@XmlTransient 
public Integer getId() { 
    return id; 
} 

@XmlElement(defaultValue="") 
public String getName() { 
    return name; 
} 

@XmlElement(name="nickname" , defaultValue="") 
public String getNickName() { 
return nickName; 
} 

@XmlElement(defaultValue="0") 
public Double getSaldo() { 
    return saldo; 
} 

public void setAge(Integer age) { 
    this.age = age; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public void setNickName(String nickName) { 
    this.nickName = nickName; 
} 

public void setSaldo(Double saldo) { 
    this.saldo = saldo; 
} 


} 
+0

+1 - 你說得對。 – 2012-08-16 11:44:18

+0

非常感謝Err,你的解釋是我的解決方案,, – 2012-08-18 09:09:29

+0

hallo Err,我有其他問題.. 我的Java類,它也是該類中的xml註釋是來自xsd文件的JAXB Binding的結果,在我的情況下JAXB Binding define '@XmlAttribute'屬性,所以我如何爲該屬性分配defaultValue。 謝謝 – 2012-08-19 07:33:53

1

如果您在聲明它們時用默認值實例化成員,則應該修復第一個問題。

嘗試:

public class Person{ 
private String name = ""; 
private Integer age = 0; 
private String nickName; = "" 
private Integer id = 0; 
private Double saldo =0.0; 

心連心,
mcalex

0

我使用CXF-CODEGEN-插件,你可以(從XSD/WSDL開始)

  1. 設置的默認您的數據模型的XSD中的值(每種類型的「默認」關鍵字)
  2. 使用cxf-xjc-dv擴展名lugin處理生成類的getter中的默認值。

這將爲實例創建一個getter你的年齡字段是這樣的:

public Integer getAge() { 
    if (age == null) 
     return new Interger(0); 
    return age; 
} 
+0

這是任擇議定書想要什麼,但相反的,因爲這將返回默認值是在XML和空字符串/空值_are_指定的元素_not_規定,但有一個空值的元素。 OP希望指定但空的 - >默認和未指定 - >'null'。 – 2012-08-16 10:11:32

3

這是有點麻煩,但你應該能夠達到你想要使用類型的適配器什麼:

public class Person{ 
    private String name; 
    @XmlJavaTypeAdapter(IntegerZeroDefaultAdapter.class) 
    @XmlSchemaType(name = "integer") 
    private Integer age; 
    private String nickName; 
    private Integer id; 
    @XmlJavaTypeAdapter(DoubleZeroDefaultAdapter.class) 
    @XmlSchemaType(name = "double") 
    private Double saldo; 
    // ...  
} 

public class IntegerZeroDefaultAdapter extends XmlAdapter<String, Integer> { 
    public String marshal(Integer n) { 
    return String.valueOf(n); 
    } 

    public Integer unmarshal(String val) { 
    if(val == null) return null; 
    else if("".equals(val)) return 0; 
    else return Integer.valueOf(val); 
    } 
} 

// likewise for DoubleZeroDefaultAdapter 

除非您要使用的默認值不是空字符串,否則您不需要適配器名稱或暱稱 - 字符串值的默認值是缺少的元素表示null和指定的bu t-empty元素表示空字符串,請記住在XML中<nickname />完全等同於<nickname></nickname>

+0

儘管在重新閱讀文檔時,我會說Err的回答使用@XmlElement(defaultValue =「...」)是更好的解決方案。 – 2012-08-16 14:14:33

+0

感謝Ian Roberts,儘管Err的回答更簡單,但是您的解釋是我處理複雜元素(如java.util.Date或其他不包裝類(Custom Class))的解決方案。 – 2012-08-18 09:13:29

相關問題