2017-03-17 93 views
0

我仔細研究了"JAXB Adding attributes..."的討論,並想進一步推進。JAXB - 爲不同的元素添加相同的屬性

例如,有下面的類:

@XmlRootElement(name = "company") 
@XmlType(propOrder = {"id", "name", "address"}) 
public class Company { 

    private String id; 
    private String name; 
    private String address; 

    @XmlElement(name = "id") 
    public String getId() { 
     return id; 
    } 

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

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

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

    @XmlElement(name = "address") 
    public String getAddress() { 
     return name; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 
} 

編組對象後,我們有:

<company> 
    <id>1</id> 
    <name>Abc</name> 
    <address>Mountain View, United States</address> 
</company> 

是否有一個優雅的解決方案, - 例如使用註釋@XmlPaths@XmlPath@XmlElements@XmlElement, - 因此收到:

<company> 
    <id>1</id> 
    <name lang="en">Abc</name> 
    <address lang="en">Mountain View, United States</address> 
</company> 
+0

您提供的鏈接中的解決方案有什麼問題。 – ulab

+0

如果您使用的是MOXy,請瀏覽http://blog.bdoughan.com/2011/03/map-to-element-based-on-attribute-value.html。 –

回答

1

如何用lang屬性和使用創建自定義字符串,而不是字符串

例如:

public class LangString { 

    @XmlValue 
    protected String value; 
    @XmlAttribute(name = "lang") 
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class) 
    @XmlSchemaType(name = "language") 
    protected String lang; 

    //GETTERS & SETTERS 
} 

您的代碼:

@XmlRootElement(name = "company") 
@XmlType(propOrder = {"id", "name", "address"}) 
public class Company { 

    private String id; 
    private LangString name; 
    private LangString address; 

    @XmlElement(name = "id") 
    public String getId() { 
     return id; 
    } 

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

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

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

    @XmlElement(name = "address") 
    public LangString getAddress() { 
     return name; 
    } 

    public void setAddress(LangString address) { 
     this.address = address; 
    } 
} 

上面從XSD生成的代碼我的應用程序具有lang屬性元素的模式,因此爲@XmlSchemaType

希望它有幫助

+0

是的,但是如果必須將屬性添加到許多不是對象(類)的xml元素,該怎麼辦?你將不得不爲每個人編寫一個類,這使得這個解決方案不切實際。 –

+0

您是指具有不同名稱的屬性? – stevengatsios

+0

不,我是指具有相同名稱的屬性。例如,在OP示例中,屬性lang應與名稱和地址字段相關聯。然而,使用你的建議,你將不得不創建2個新的類(例如AddressLang和NameLang),每個類都有一個名爲lang的屬性。這可行但不切實際。另外,在這種情況下,不需要擴展XmlAdapter。 –

相關問題