XML根元素结束标签含命名空间问题及JAXB代码修正需求
解决JAXB生成XML根元素结束标签冗余命名空间问题
问题说明
使用JAXB生成XML时,根元素<report>的结束标签被错误添加了冗余的命名空间属性,不符合XML规范,需要调整代码以生成标准结构。
错误XML示例
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <report xmlns="urn:nonstandard:****"> <headers/> <report_details/> </report xmlns="urn:nonstandard:****">
问题代码片段
@XmlRootElement(name = "report", namespace = "xmlns=urn:nonstandard:****") @XmlAccessorType(XmlAccessType.FIELD) public class ReportVo { @XmlElement(name="header") private HeaderVo headerVo; @XmlElement(name="report_details") private ReportDetailsVO reportDetailsVo; }
期望生成的标准XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <report xmlns="urn:nonstandard:****"> <headers/> <report_details/> </report>
解决方案
核心问题定位
@XmlRootElement注解的namespace属性值错误携带了xmlns=前缀,JAXB将这个错误值解析为元素属性,导致结束标签冗余输出该属性。
修正步骤
直接修正根元素的namespace属性
移除namespace值中的xmlns=前缀,仅保留纯命名空间URI:@XmlRootElement(name = "report", namespace = "urn:nonstandard:****") @XmlAccessorType(XmlAccessType.FIELD) public class ReportVo { @XmlElement(name="header", namespace = "urn:nonstandard:****") private HeaderVo headerVo; @XmlElement(name="report_details", namespace = "urn:nonstandard:****") private ReportDetailsVO reportDetailsVo; }(推荐)包级别统一配置命名空间
在实体类所在包下创建package-info.java,通过@XmlSchema统一指定命名空间,避免在每个元素上重复配置:@XmlSchema( namespace = "urn:nonstandard:****", elementFormDefault = XmlNsForm.QUALIFIED ) package com.your.actual.package; // 替换为你的实体类所在包名 import javax.xml.bind.annotation.XmlNsForm; import javax.xml.bind.annotation.XmlSchema;此时实体类无需再单独指定namespace:
@XmlRootElement(name = "report") @XmlAccessorType(XmlAccessType.FIELD) public class ReportVo { @XmlElement(name="header") private HeaderVo headerVo; @XmlElement(name="report_details") private ReportDetailsVO reportDetailsVo; }
执行上述修正后,JAXB生成的XML根元素结束标签将不再携带冗余的命名空间属性,符合规范要求。
内容的提问来源于stack exchange,提问作者AnilSrinivas Muddineni
相关产品推荐
相关产品推荐

