You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中XmlSerializer能否用XPath方式跳过中间元素映射XML节点?

跳过XML中间层级实现反序列化

问题背景

现有XML结构:

<Form_1_1>
    <Body>
        <Code>123</Code>
    </Body>
</Form_1_1>

原反序列化类结构:

[XmlRoot("Form_1_1")]
public class Form_1_1
{
    [XmlElement(ElementName = "Body")]
    public Body Body { get; set; }
}

public class Body
{
    [XmlElement(ElementName = "Code")]
    public string Code { get; set; }
}

需求:跳过<Body>元素,直接将<Code>映射到Form_1_1的Code属性,目标类结构:

[XmlRoot("Form_1_1")]
public class Form_1_1
{
    // 需填写合适特性,直接映射<Body>下的<Code>
    public string Code { get; set; }
}

限制:XmlElement特性不支持XPath;因XML过长,无法用LINQ to XML逐节点映射,只能使用XmlSerializer.Deserialize方法。

可行方案

通过私有中转属性+内部代理类实现,既保留XmlSerializer的自动处理能力,又隐藏中间层级:

[XmlRoot("Form_1_1")]
public class Form_1_1
{
    // 对外暴露的Code属性,标记为XmlIgnore,不直接参与序列化
    [XmlIgnore]
    public string Code { get; set; }

    // 私有属性,绑定XML的<Body>节点,负责中转值
    [XmlElement("Body")]
    private BodyProxy InnerBody
    {
        get => new BodyProxy { Code = this.Code };
        set => this.Code = value?.Code;
    }

    // 内部代理类,仅用于映射XML的<Body>结构
    private class BodyProxy
    {
        [XmlElement("Code")]
        public string Code { get; set; }
    }
}

方案说明

  • 对外的Code属性用[XmlIgnore]标记,避免被XmlSerializer直接处理
  • 私有InnerBody属性绑定XML的<Body>节点,通过其get/set方法完成Code值的双向中转
  • 内部BodyProxy类仅用于匹配XML结构,对外不可见

若XML中有多个需要跳过层级的属性,只需在BodyProxy中添加对应属性即可,无需逐个处理XML节点,适配长XML场景。

内容的提问来源于stack exchange,提问作者Pawan Nogariya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:55:04