首页 > 解决方案 > 反序列化 XML 时绕过特定的父节点?

问题描述

假设以下 XML:

<A>
    <B>
        <B1>b1Value</B1>
        <B2>b2Value</B2>
        <B3>b3Value</B3>
    </B>
    <C Attr="val1"/>
    <C Attr="val2"/>
    <C Attr="val3"/>
</A>

以及以下所需的反序列化类:

public class C
{
    [XmlAttribute]
    public string Attr { get; set; }
}

[XmlRoot]
public class A
{
    [XmlElement("C")]
    public C[] Cs { get; set; }
    public string B1 { get; set; }
    public string B2 { get; set; }
    public string B3 { get; set; }
}

如何反序列化 XML 以使我的 A 类具有属性 B1、B2 和 B3,而没有父属性 B?

当我使用此代码时:

string xml =
@"<A>
    <B>
        <B1>b1Value</B1>
        <B2>b2Value</B2>
        <B3>b3Value</B3>
    </B>
    <C Attr=""val1""/>
    <C Attr=""val2""/>
    <C Attr=""val3""/>
</A>";

XmlSerializer serializer = new XmlSerializer(typeof(A));
A a;

using (TextReader reader = new StringReader(xml))
{
    a = serializer.Deserialize(reader) as A;
}

所有 BX 属性都是空白的。

dotnetfiddle 在这里

谢谢。

标签: c#xml-deserialization

解决方案


您可以添加只读属性以访问所需级别的数据。

public class C
{
    [XmlAttribute]
    public string Attr { get; set; }
}
public class B
{
    [XmlElement]
    public string B1 { get; set; }
    [XmlElement]
    public string B2 { get; set; }
    [XmlElement]
    public string B3 { get; set; }
}
[XmlRoot]
public class A
{
    [XmlElement("C")]
    public C[] Cs { get; set; }
    [XmlElement("B")]
    public B B { get; set; }

    [XmlIgnore()]
    public string B1 => B?.B1;
    [XmlIgnore()]
    public string B2 => B?.B2;
    [XmlIgnore()]
    public string B3 => B?.B3;
}

dotnetfiddle


推荐阅读