You need to enable JavaScript to run this app. Castor 0.9.9.1如何映射XML元素属性并解决非法文本报错
优惠活动
大模型
产品
解决方案
定价
更多

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的解析校验逻辑,不需要开启容错跳过,既解决报错问题,还能完整获取节点的所有信息:

  1. 在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;
        }
    }
    
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.11 03:45:09