2017-03-17 69 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。 –

相关问题