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

このようなxmlをアンマーシャルしたい場合は、クラスAnimalsとDogを作成する必要があります。
クラスは1つしか作成できませんか?空の要素を単一の属性でアンマーシャリングする

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

あなたのドメインモデルのうち、Dogクラスを維持するために、 'XmlAdapter'を活用できます。http://stackoverflow.com/questions/6871469/unmarshalling- 1つの属性を持つ空の要素/ 6871995#6871995 –

1

注:私はEclipseLink JAXB (MOXy)リードだし、 JAXB(JSR-222)の専門家グループのメンバーです。

クラスは1つしか作成できませんか?

はい、これはいくつかの異なる方法で行うことができますMOXYの@XmlPath拡張子を使用してXmlAdapter

  • を使用して

    オプション1 - XmlAdapterの

    このアプローチは、suggested by skaffmanは、それはあなたのドメインモデルのうちのロジックを保持します:

    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 - MOXYの@XmlPath拡張

    あなたはこのユースケースをマッピングするためにMOXYで@XmlPath拡張子を使用することができます。詳細情報

  • 関連する問題