Castor 0.9.9.1如何映射XML元素属性并解决非法文本报错
Castor 0.9.9.1 解析XML时处理节点文本值的实现方案
报错根因
Castor 0.9.9.1 对非混合内容的XML节点做严格校验:你当前的映射规则只为<Livello>节点配置了nome属性的绑定逻辑,没有声明如何处理<Livello>标签包裹的直接文本内容(也就是示例中值为"1"的文本节点),解析器会将这段未被规则覆盖的文本判定为非法子节点,最终抛出Illegal Text data found as child of: Livello异常。
推荐方案:将<Livello>的文本值映射到对应Java类属性
这种实现完全匹配Castor的解析校验逻辑,不需要开启容错跳过,既解决报错问题,还能完整获取节点的所有信息:
- 在
LivelloIDT类中新增用于存储节点文本值的字段,补充对应getter/setter方法:package it; public class LivelloIDT { /** 对应Livello节点的nome属性值 */ private String nome; /** 对应Livello节点包裹的文本值 */ private String valore; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getValore() { return valore; } public void setValore(String valore) { this.valore = valore; } } - 修改Castor映射规则中
LivelloIDT的配置,新增对节点文本的绑定:<class name="it.LivelloIDT" auto-complete="true"> <map-to xml="Livello"/> <!-- 原有nome属性的映射保持不变 --> <field name="nome"> <bind-xml name="nome" node="attribute"/> </field> <!-- 新增文本绑定:*node="text"* 代表映射当前元素的直接文本内容 --> <field name="valore"> <bind-xml node="text"/> </field> </class>
配置说明:bind-xml的node="text"参数会直接将当前XML元素标签内的文本值注入对应的Java字段,没有额外的兼容开销。原有的ClassificaIDT类和对应映射规则不需要做任何修改。
备选方案:直接忽略<Livello>下的文本值
如果业务上完全不需要获取这段文本值,只需要读取nome属性,可以通过两种配置让Castor跳过未声明的文本节点,避免校验报错:
- 开启节点忽略开关:在
LivelloIDT的class映射节点上添加ignore-extra-node="true"配置,解析器遇到所有未被映射规则声明的子节点、文本节点时会直接跳过,不抛出异常:<class name="it.LivelloIDT" auto-complete="true" ignore-extra-node="true"> <map-to xml="Livello"/> <field name="nome"> <bind-xml name="nome" node="attribute"/> </field> </class> - 标记为混合内容节点:在
LivelloIDT的class映射节点上添加mapping="mixed"配置,告知解析器当前节点允许包含混合文本内容,无需对未绑定的文本做校验:<class name="it.LivelloIDT" auto-complete="true" mapping="mixed"> <map-to xml="Livello"/> <field name="nome"> <bind-xml name="nome" node="attribute"/> </field> </class>
内容的提问来源于stack exchange,提问作者Felix Sima
相关产品推荐
相关产品推荐

