2011-07-29 172 views
2
<animals> 
    <dog name="Pluto"></dog> 
</animals> 

如果想解開這樣的XML,我需要創建類動物和狗。
是否有可能只創建一個類?unmarshalling具有單一屬性的空元素

public class Animals{ 
    private String dog; // value of this field should be "Pluto" 
    private void setDog(String dog); 
    private String getDog(); 
} 

我應該如何在動物中註解方法?

回答

1

沒有,你仍然需要2班,但你可以隱藏的狗類,並暴露在你的外部類相同的方法:

public class Animals{ 
    private @XmlElement Dog dog; 

    public void setDog(String dogName) { 
     dog = new Dog(); 
     dog.name = dogName; 
    } 

    public String getDog() { 
     return dog.name; 
    } 


    public static class Dog { 
     private @XmlAttribute String name; 
    } 
} 
+1

你可以利用一個'XmlAdapter'保持狗類出你的域模型:http://stackoverflow.com/questions/6871469/unmarshalling-空元素上帶有一個單屬性/ 6871995#6871995 –

1

注:我是EclipseLink JAXB (MOXy)領先, JAXB的成員(JSR-222)專家組。

是否有可能只創建一個類?

是的,這可以在幾個不同的方式來完成:

  1. 使用的XmlAdapter
  2. 使用莫西的@XmlPath擴展

選項1 - XmlAdapter

這種方法與0相似只有它保持邏輯出你的域模型:

package forum6871469; 

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class DogAdapter extends XmlAdapter<DogAdapter.Dog, String> { 

    @Override 
    public Dog marshal(String name) throws Exception { 
     Dog dog = new Dog(); 
     dog.name = name; 
     return dog; 
    } 

    @Override 
    public String unmarshal(Dog dog) throws Exception { 
     return dog.name; 
    } 

    public static class Dog { 

     @XmlAttribute 
     public String name; 
    } 

} 

XmlAdapter使用@XmlJavaTypeAdaper註釋引用:

package forum6871469; 

import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlRootElement 
public class Animals{ 
    private String dog; // value of this field should be "Pluto" 

    @XmlJavaTypeAdapter(DogAdapter.class) 
    public String getDog() { 
     return dog; 
    } 

    public void setDog(String dogName) { 
     dog = dogName; 
    } 

} 

更多信息

選擇2 - 莫西的@XmlPath擴展

可以使用@XmlPath擴展在莫西這個用例圖:

package forum6871469; 

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

@XmlRootElement 
public class Animals{ 
    private String dog; // value of this field should be "Pluto" 

    @XmlPath("dog/@name") 
    public String getDog() { 
     return dog; 
    } 

    public void setDog(String dogName) { 
     dog = dogName; 
    } 

} 

更多信息

相關問題