c# - 反序列化 XML 时绕过特定父节点?

标签 c# xml-deserialization

假设以下 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 here ,

谢谢。

最佳答案

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

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

关于c# - 反序列化 XML 时绕过特定父节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59970296/

相关文章:

c# - 如何在 C# 中扩展数组

c# - MVC5 CSS/Lay-Out 在一台 PC 上工作,而不是另一台

c# - 在 C# 中反序列化 XML 文件

c# - 稍微不平凡的数据结构 : is XmlSerializer right for me?

java - 使用多个元素名称反序列化的简单 xml 框架

c# - 索引超出范围异常 - C#

c# - c# - 如何从包含特定单词的字符串中获取文本?

c# - Excel.ExcelReaderFactory 无法打开某些文件

java - 元素名称已使用简单框架

c# - 如何在 xml 反序列化期间忽略无效的枚举值?