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)
我认为这对你更有帮助.
谢谢..
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)