2012-09-12 92 views
1

有沒有辦法做單一的java bean這種簡單的XML映射:訪問屬性

<item lang="en"> 
    <item-url>some url</item-url> 
    <parent id="id_123"/> 
</item> 

我已經試過這樣的事情:

@XmlRootElement(name = "item") 
public class Item { 

    @XmlElement(name = "item-url") 
    private String url; 

    @XmlAttribute(name = "parent/@id") 
    // Of course XPath doesn't work here, but it would be great... 
    private String parentId; 
} 

換句話說 - 我如何在不創建相應的bean的情況下訪問內部元素的屬性?

+0

看看這個線程,回答你的問題:HTTP:/ /stackoverflow.com/questions/3666467/how-can-i-add-xml-attributes-to-jaxb-annotaded-class-xmlelementwrapper – Alex

+0

@Alex,謝謝。很遺憾,但我不使用'MOXy JAXB實現'。我沒有那個註釋。我只能從包'javax.xml.bind.annotation。*'' – stemm

+1

中使用註釋。所以簡短的回答並不是我所知道的。正如鏈接的SO問題所述,您將不得不實現一個XmlAdapter。所以你可能更容易找到一個帶'id'屬性的'Parent'對象。 – Alex

回答

1

你可以使用一個XmlAdapter

ParentIdAdapter

public class ParentIdAdapter extends XmlAdapter<ParentIdAdapter.AdaptedParentId, String> { 

    public String unmarshal(AdaptedParentId value) { 
     return value.id; 
    } 

    public AdaptedParentId marshal(String value) { 
     AdaptedParentId adapted = new AdaptedParentId(); 
     adapted.id = value; 
     return adapted; 
    } 

    public static class AdaptedParentId { 
     @XmlAttribute 
     public String id; 
    } 

} 

項目

@XmlRootElement(name = "item") 
public class Item { 

    @XmlElement(name = "item-url") 
    private String url; 

    @XmlElement(name = "parent") 
    @XmlJavaTypeAdapter(ParentIdAdapter.class) 
    private String parentId; 
} 

如果您正在使用EclipseLink MOXy爲您的JAXB提供者,那麼你可以充分利用@XmlPath擴展做到以下幾點:

@XmlRootElement(name = "item") 
public class Item { 

    @XmlElement(name = "item-url") 
    private String url; 

    @XmlPath("parent/@id") 
    private String parentId; 
} 
0

,因爲我不希望在我的包來創建多餘的類,我已經找到了最好的解決方案是:

@XmlRootElement(name = "item") 
public class Item { 

    @XmlRootElement(name = "parent") 
    private static class ParentIdWrapper { 
     @XmlAttribute(name = "id") 
     public String id; 
    } 

    @XmlElement(name = "item-url") 
    private String url; 

    @XmlElement(name = "parent") 
    private ParentIdWrapper parentIdWrap; 

    public String getParentId() { 
     return this.parentIdWrap.id; 
    } 
}