英文:
Need XML root element without end tag using JAXB STAX in combination
问题
以下是您提供的内容的翻译:
我正在尝试将列表编组为XML。由于XML包含列表,并且我不想为外部标签创建单独的类,所以我在使用STAX和JAXB的组合。
问题是,我得到了带有结束标签的元素。
实际输出
<WRAPPER>
<ROOT att1="val1" att2="val2"></ROOT>
<ROOT att1="val1" att2="val2"></ROOT>
</WRAPPER>
期望输出
<WRAPPER>
<ROOT att1="val1" att2="val2"/>
<ROOT att1="val1" att2="val2"/>
</WRAPPER>
类文件
@XmlRootElement(name="ROOT")
@XmlAccessorType(XmlAccessType.FIELD)
public class ROOT {
@XmlAttribute(name = "att1")
String att1;
@XmlAttribute(name = "att2")
String att2;
public String getAtt1() {
return att1;
}
public void setAtt1(String att1) {
this.att1 = att1;
}
public String getAtt2() {
return att2;
}
public void setAtt2(String att2) {
this.att2 = att2;
}
}
方法
public static String marshal(List<ROOT> list)
throws XMLStreamException, JAXBException, IOException {
JAXBElement<ROOT> jaxb = null;
String xmlString = null;
if (!CollectionUtils.isEmpty(list)) {
QName root = new QName("ROOT");
XMLOutputFactory outputFactory = XMLOutputFactory.newFactory();
StringWriter stringWriter = new StringWriter();
XMLStreamWriter streamWriter = outputFactory.createXMLStreamWriter(stringWriter);
streamWriter.writeStartElement("WRAPPER");
JAXBContext jc = JAXBContext.newInstance(ROOT.class);
Marshaller marshaller = jc.createMarshaller();
for (ROOT t : list) {
jaxb = new JAXBElement<ROOT>(root, ROOT.class, t);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.marshal(jaxb, streamWriter);
}
streamWriter.writeEndDocument();
xmlString = stringWriter.toString();
stringWriter.close();
streamWriter.close();
}
return xmlString;
}
问题是nillable不能应用于XmlRootElement。
英文:
I am trying to marshal list to xml. As the xml contains list and I do not want to create separate class for outer tag I am using STAX and JAXB in combination.
The issue is I am getting element with end tag.
actual output
<WRAPPER>
<ROOT att1="val1" att2="val2"></ROOT>
<ROOT att1="val1" att2="val2"></ROOT>
</WRAPPER>
Expected Output
<WRAPPER>
<ROOT att1="val1" att2="val2"/>
<ROOT att1="val1" att2="val2"/>
</WRAPPER>
Class file
@XmlRootElement(name="ROOT")
@XmlAccessorType(XmlAccessType.FIELD)
public class ROOT {
@XmlAttribute(name = "att1")
String att1;
@XmlAttribute(name = "att2")
String att2;
public String getAtt1() {
return att1;
}
public void setAtt1(String att1) {
this.att1 = att1;
}
public String getAtt2() {
return att2;
}
public void setAtt2(String att2) {
this.att2 = att2;
}
}
Method
public static String marshal(List<ROOT> list)
throws XMLStreamException, JAXBException, IOException {
JAXBElement<ROOT> jaxb = null;
String xmlString = null;
if (!CollectionUtils.isEmpty(list)) {
QName root = new QName("ROOT");
XMLOutputFactory outputFactory = XMLOutputFactory.newFactory();
StringWriter stringWriter = new StringWriter();
XMLStreamWriter streamWriter = outputFactory.createXMLStreamWriter(stringWriter);
streamWriter.writeStartElement("WRAPPER");
JAXBContext jc = JAXBContext.newInstance(ROOT.class);
Marshaller marshaller = jc.createMarshaller();
for (ROOT t : list) {
jaxb = new JAXBElement<ROOT>(root, ROOT.class, t);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.marshal(jaxb, streamWriter);
}
streamWriter.writeEndDocument();
xmlString = stringWriter.toString();
stringWriter.close();
streamWriter.close();
}
return xmlString;
}
Problem is nillable cannot be applied to XmlRootElement
答案1
得分: 0
虽然从技术上讲,预期值和实际值是相等的,但我发现没有办法在不创建额外包装类的情况下修改它。
英文:
Although both expected and actual are technically equal I found no way to modify that in the way without creating additional wrapper class.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论