![](/img/trans.png)
[英]How to change name of root element in map to xml conversion with xstream
[英]How to change root element
我正在使用JAXB库将Java对象转换为XML文件。 现在我得到的输出是:
<company>
<name>Amazon</name>
</company>
我想要得到的是:
<companies>
<company>
<name>Amazon</name>
</company>
</companies>
我如何达到目标? 我是否必须从Java对象中删除@XmlRootElement
(并且要诅咒执行其他操作)?
@XmlRootElement
public class Company {
private String name;
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
}
还是应该使用Marshaller
方法编辑类?
public String marshall(BasicModel basicModel){
JAXBContext jaxbContext = JAXBContext.newInstance(basicModel.getClass());
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
StringWriter writer = new StringWriter();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(basicModel, writer);
return writer.toString();
}
您可以创建包装器类并对其进行序列化,无论Company
还是@XmlRootElement
,它都将起作用:
@XmlRootElement(name = "companies")
@XmlAccessorType(XmlAccessType.FIELD)
public class Companies {
@XmlElement(name = "company")
List<Company> companies = new ArrayList<Company>();
// getters , setters...
}
包裹一下:
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlRootElement;
public class Test {
@XmlRootElement
public static class Companies {
private Company[] company;
public Companies(){}
public Companies(Company[] company){this.company = company;}
public Company[] getCompany() {
return company;
}
public void setCompany(Company[] company) {
this.company = company;
}
}
@XmlRootElement
public static class Company {
private String name;
public Company(){}
public Company(String name){this.name = name;}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static String marshall(Object basicModel) throws JAXBException{
JAXBContext jaxbContext = JAXBContext.newInstance(basicModel.getClass());
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
StringWriter writer = new StringWriter();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(basicModel, writer);
return writer.toString();
}
public static void main(String[] args) throws JAXBException {
Company comp1 = new Company("test");
System.out.println(marshall(comp1));
Companies c = new Companies();
Company[] compArr = new Company[1];
compArr[0] = comp1;
c.setCompany(compArr);
System.out.println(marshall(c));
}
}
这将产生以下输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<company>
<name>test</name>
</company>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<companies>
<company>
<name>test</name>
</company>
</companies>
(在假设您要保留公司列表的情况下,我使用了一个数组。)
SimpleXml可以做到:
final String data = ...
final SimpleXml simple = new SimpleXml();
final Element element = element("companies").child(simple.fromXml(data));
System.out.println(simple.domToXml(element));
将输出;
<companies><company><name>Amazon</name></company></companies>
从Maven Central:
<dependency>
<groupId>com.github.codemonstur</groupId>
<artifactId>simplexml</artifactId>
<version>1.4.0</version>
</dependency>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.