使用javax.xml库序列化Java对象列表时,如何设置正确的父子节点名
解决JAXB序列化XML节点名称不符的问题
问题原因
你遇到的子节点与父节点名称重复的问题,核心原因是自定义Document类的JAXB注解配置错误——比如Document类上标注了@XmlRootElement(name="Documents"),或者类内注解导致序列化时子节点名称被错误覆盖为Documents。
解决方案
1. 修正Document类的注解
确保Document类的根元素名称设为Document,而非Documents,示例代码如下:
import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "Document") // 关键:此处名称必须为Document public class Document { // 类字段示例 private String content; // JAXB强制要求无参构造器 public Document() {} // getter/setter方法 public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
2. 保留原有数组字段的注解
你当前的数组字段注解是正确的,无需修改:
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; public class YourParentClass { @XmlElementWrapper(name = "Documents") // 外层包裹节点 @XmlElement(name = "Document") // 每个子节点的名称 private Document[] documents; // JAXB强制要求无参构造器 public YourParentClass() {} // getter/setter方法 public Document[] getDocuments() { return documents; } public void setDocuments(Document[] documents) { this.documents = documents; } }
预期序列化结果
完成上述配置后,序列化生成的XML会完全符合你的需求:
<Documents> <Document> <content>示例内容1</content> </Document> <Document> <content>示例内容2</content> </Document> </Documents>
额外注意事项
- JAXB要求所有被序列化的类必须提供无参构造器,否则会抛出序列化异常。
- 如果
Document类内的字段需要自定义节点名称,单独用@XmlElement标注即可,不要修改类级别的@XmlRootElement配置。
内容的提问来源于stack exchange,提问作者zaidabuhijleh
相关产品推荐
相关产品推荐

