如何将xml属性添加到jaxb带注释的类XmlElementWrapper?

ABX*_*ABX 24 xml annotations linked-list jaxb

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

...

  @XmlElementWrapper(name="myList")
    @XmlElements({
    @XmlElement(name="myElement") }
    )
    private List<SomeType> someList = new LinkedList();
Run Code Online (Sandbox Code Playgroud)

...这段代码生成XML

<myList>
  <myElement> </myElement>
  <myElement> </myElement>
  <myElement> </myElement>
</myList>
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

但是现在我需要在list标签中添加属性以获得XML

<myList number="2">
  <myElement> </myElement>
  <myElement> </myElement>
  <myElement> </myElement>
</myList>
Run Code Online (Sandbox Code Playgroud)

有没有一种'聪明的方法来实现这一目标而不创建一个包含代表列表的新类?

小智 28

我为你的问题找到了更好的解决方案.

要制作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
    }
Run Code Online (Sandbox Code Playgroud)

}

要使用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);
        }
}
Run Code Online (Sandbox Code Playgroud)

这将生成以下XML作为输出:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <myList number="123">
        <myElement>FOO</myElement>
        <myElement>BAR</myElement>
    </myList>
Run Code Online (Sandbox Code Playgroud)

我认为这对你更有帮助.

谢谢..

  • 如果你只有一个集合类型被包装,那么Noby的解决方案效果很好(在示例中,它是一个字符串).如果要扩展解决方案以创建具有属性的更通用的列表包装类,可以使用@XmlElements批注创建其他映射.我在这个评论中的空间不足,所以我将在另一个答案中发布示例代码. (2认同)

bdo*_*han 11

莫西 JAXB实现(我是技术主管)具有扩展名(@XmlPath)来处理这种情况:

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;
    } 

}
Run Code Online (Sandbox Code Playgroud)

将生成以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <myList number="123">
      <myElement>FOO</myElement>
      <myElement>BAR</myElement>
   </myList>
</root>
Run Code Online (Sandbox Code Playgroud)

运行此代码时:

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Root root = new Root();
        root.setNumber(123);
        root.getSomeList().add("FOO");
        root.getSomeList().add("BAR");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用严格标准的JAXB代码使其工作,您需要使用XML适配器:

注意:

要使用莫西JAXB您需要添加一个名为jaxb.properties文件与以下项的模型类:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)