如何向jaxb注释类XmlElementWrapper添加xml属性?

如何向jaxb注释类XmlElementWrapper添加xml属性?,xml,annotations,jaxb,linked-list,Xml,Annotations,Jaxb,Linked List,我有一个带有XmlElementWrapper注释的类,如: @xmlementwrapper(name=“myList”) @XmlElements({ @xmlement(name=“myElement”)} ) private List someList=new LinkedList(); 。。。 这段代码生成类似XML的代码 <myList> <myElement> </myElement> <myElement> </m

我有一个带有XmlElementWrapper注释的类,如:

@xmlementwrapper(name=“myList”)
@XmlElements({
@xmlement(name=“myElement”)}
)
private List someList=new LinkedList();
。。。 这段代码生成类似XML的代码

<myList>
  <myElement> </myElement>
  <myElement> </myElement>
  <myElement> </myElement>
</myList>
<myList number="2">
  <myElement> </myElement>
  <myElement> </myElement>
  <myElement> </myElement>
</myList>

到目前为止还不错

但现在我需要向list标记添加属性,以获得类似XML的属性

<myList>
  <myElement> </myElement>
  <myElement> </myElement>
  <myElement> </myElement>
</myList>
<myList number="2">
  <myElement> </myElement>
  <myElement> </myElement>
  <myElement> </myElement>
</myList>

有没有一种“聪明的方法”可以实现这一点,而不必创建一个包含表示列表的新类?

JAXB实现(我是技术负责人)有一个扩展()来处理这种情况:

import java.util.*;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlPath("myList/@number")
    private int number;

    @XmlElementWrapper(name="myList") 
    @XmlElement(name="myElement") 
    private List<String> someList = new LinkedList<String>();

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public List<String> getSomeList() {
        return someList;
    }

    public void setSomeList(List<String> someList) {
        this.someList = someList;
    } 

}
要使用严格标准的JAXB代码实现这一点,您需要使用XML适配器:

注意:

要使用MOXy JAXB,您需要在模型类中添加一个名为JAXB.properties的文件,其中包含以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

我为你的问题找到了更好的解决办法

要生成Xml Java对象,请使用以下代码:

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement(name="myList")
public class Root {

    private String number;
    private List<String> someList;

    @XmlAttribute(name="number")
    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    @XmlElement(name="myElement")
    public List<String> getSomeList() {
        return someList;
    }

    public void setSomeList(List<String> someList) {
        this.someList = someList;
    } 

    public Root(String numValue,List<String> someListValue) {
        this();
        this.number = numValue;
        this.someList = someListValue;  
    }

    /**
     * 
     */
    public Root() {
        // TODO Auto-generated constructor stub
    }
import java.util.*;
导入javax.xml.bind.annotation.*;
@XmlRootElement(name=“myList”)
公共类根{
私有字符串编号;
私人名单;
@xmldattribute(name=“number”)
公共字符串getNumber(){
返回号码;
}
公共无效集合号(字符串号){
这个数字=数字;
}
@xmlement(name=“myElement”)
公共列表getSomeList(){
返回一些列表;
}
public void setSomeList(List someList){
this.someList=someList;
} 
公共根(字符串numValue,列表someListValue){
这个();
this.number=numValue;
this.someList=someListValue;
}
/**
* 
*/
公共根(){
//TODO自动生成的构造函数存根
}
}

要使用JAXB运行上述代码,请使用以下命令:

   import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.*;

public class Demo {

        public static void main(String[] args) throws Exception {
            List<String> arg = new ArrayList<String>();
            arg.add("FOO");
            arg.add("BAR");
            Root root = new Root("123", arg);

            JAXBContext jc = JAXBContext.newInstance(Root.class);
            Marshaller marshaller = jc.createMarshaller();
            marshaller.marshal(root, System.out);
        }
}
import java.util.ArrayList;
导入java.util.List;
导入javax.xml.bind.*;
公开课演示{
公共静态void main(字符串[]args)引发异常{
List arg=new ArrayList();
参数添加(“FOO”);
参数添加(“条”);
根根=新根(“123”,arg);
JAXBContext jc=JAXBContext.newInstance(Root.class);
Marshaller=jc.createMarshaller();
marshaller.marshall(root,System.out);
}
}
这将生成以下XML作为输出:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <myList number="123">
        <myElement>FOO</myElement>
        <myElement>BAR</myElement>
    </myList>

福
酒吧
我认为这对你更有帮助


谢谢..

如果您不使用MOXy或只是想坚持使用标准的JAXB注释,那么您可以根据Noby的回答添加对通用包装器类的支持。Noby的答案目前只支持字符串列表,但举例来说,您将对几个不同的类使用相同的通用包装器类。在我的示例中,我希望创建一个通用的“PagedList”类,该类将生成类似于列表的内容,但还包含有关页面偏移量和未分页列表中元素总数的信息

此解决方案的一个缺点是,您必须为将要包装的每种类型的类添加额外的@XmlElement映射。总的来说,这可能是一个比为每个可分页元素创建一个新类更好的解决方案

@XmlType
public class PagedList<T> {
    @XmlAttribute
    public int offset;

    @XmlAttribute
    public long total;

    @XmlElements({
        @XmlElement(name="order", type=Order.class),
        @XmlElement(name="address", type=Address.class)
        // additional as needed
    })
    public List<T> items;
}

@XmlRootElement(name="customer-profile")
public class CustomerProfile {
    @XmlElement
    public PagedList<Order> orders;
    @XmlElement
    public PagedList<Address> addresses;
}
@XmlType
公共类页面列表{
@XmlAttribute
公共整数偏移;
@XmlAttribute
公共长期总计;
@XmlElements({
@XmlElement(name=“order”,type=order.class),
@XmlElement(name=“address”,type=address.class)
//根据需要增加
})
公共清单项目;
}
@XmlRootElement(name=“客户档案”)
公共类CustomerProfile{
@XmlElement
公共页面列表命令;
@XmlElement
公共页面列表地址;
}
整理此示例将使您:

<customer-profile>
    <order offset="1" total="100">
        <order> ... </order>
        <order> ... </order>
        <order> ... </order>
        ...
    </orders>
    <addresses offset="1" total="5">
        <address> ... </address>
        <address> ... </address>
        <address> ... </address>
        <address> ... </address>
        <address> ... </address>
    <addresses>
</customer-profile>

... 
... 
... 
...
... 
... 
... 
... 
... 

希望有帮助。这是我至少确定的解决方案。

Noby的解决方案在只有一种集合类型被包装(在示例中,它是一个字符串)的情况下运行良好。如果您想扩展该解决方案以创建更通用的具有属性的列表包装器类,那么可以使用@XmlElements注释来创建其他映射。我在这篇评论中已经没有空间了,所以我将在另一个答案中发布示例代码。答案很好!有没有办法将常量硬编码属性放入元素?例如,在设计时只向某些@XmlElements添加类似
drawable=“true”
的内容,而不需要为每个元素创建特殊字段?
<customer-profile>
    <order offset="1" total="100">
        <order> ... </order>
        <order> ... </order>
        <order> ... </order>
        ...
    </orders>
    <addresses offset="1" total="5">
        <address> ... </address>
        <address> ... </address>
        <address> ... </address>
        <address> ... </address>
        <address> ... </address>
    <addresses>
</customer-profile>