XSD动态根元素编组失败:如何兼容不同根元素的XML解析?
解决方案:兼容多根元素的JAXB解析
方案一:在XSD阶段定义可替换根元素
直接修改XSD,让多个根元素指向同一数据类型,生成的JAXB类就能自动兼容不同根元素的XML。
示例XSD:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="META_Type"> <xs:sequence> <xs:element name="row" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="symbol" type="xs:string"/> </xs:sequence> <xs:attribute name="num" type="xs:int" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <!-- 绑定多个根元素到同一类型 --> <xs:element name="META_1" type="META_Type"/> <xs:element name="META_2" type="META_Type"/> </xs:schema>
用这个XSD重新生成JAXB类后,即可同时解析META_1和META_2为根的XML。
方案二:修改现有JAXB类,添加多根元素注解
无需重新生成XSD,直接在现有META_1类上追加@XmlRootElement注解,指定另一个根元素名称:
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "META_1Type", propOrder = { "rows" }) @XmlRootElement(name = "META_1") @XmlRootElement(name = "META_2") // 新增注解,支持META_2根元素 public class META_1 { @XmlElement(name = "row") protected List<Row> rows; // 原有getter、setter方法保持不变 }
修改后JAXB会自动识别两个根元素,映射到同一类进行解析。
方案三:解析时动态指定根元素
如果不想修改类注解,可以在解析阶段手动指定根元素信息,通过JAXBElement接收结果:
File xmlFile = new File("meta2.xml"); JAXBContext jaxbContext = JAXBContext.newInstance(META_1.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); // 动态绑定META_2根元素到META_1类 JAXBElement<META_1> element = unmarshaller.unmarshal(new StreamSource(xmlFile), META_1.class); META_1 metaData = element.getValue();
这种方式无需改动现有代码,适合临时兼容多种根元素的场景。
内容的提问来源于stack exchange,提问作者Deepak_5755
相关产品推荐
相关产品推荐

