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
相关产品推荐
相关产品推荐

