c# - 将嵌套的 XML 元素反序列化为 C# 中的类

标签 c# .net xml deserialization

我有以下我无法控制的 XML 结构(为简洁起见进行了编辑)。

<GetVehicles>
    <ApplicationArea>
        <Sender>
            <Blah></Blah>
        </Sender>
    </ApplicationArea>
    <DataArea>
        <Error>
            <Blah></Blah>
        </Error>
        <Vehicles>
            <Vehicle>
                <Colour>Blue</Colour>
                <NumOfDoors>3</NumOfDoors>
                <BodyStyle>Hatchback</BodyStyle>
            <Vehicle>
        </Vehicles>
    </DataArea>
</GetVehicles>

我有以下类(class):

[XmlRoot("GetVehicles"), XmlType("Vehicle")]
public class Vehicle
{
    public string Colour { get; set; }
    public string NumOfDoors { get; set; }
    public string BodyStyle { get; set; }
}

我希望能够将 XML 反序列化为该 Vehicle 类的单个实例。 99% 的情况下,XML 应该只返回一个“Vehicle”元素。如果它在 'Vehicles' 元素中包含多个 'Vehicle' 元素,我还没有处理它。

不幸的是,XML 数据目前没有映射到我的类属性;在调用我的 Deserialize 方法时,它们被留空。

为了完整起见,这是我的反序列化方法:

private static T Deserialize<T>(string data) where T : class, new()
{
    if (string.IsNullOrEmpty(data))
        return null;

    var ser = new XmlSerializer(typeof(T));

    using (var sr = new StringReader(data))
    {
        return (T)ser.Deserialize(sr);
    }
}

我不关心其他更多的父元素,例如“ApplicationArea”、“Error”等。我只对提取“Vehicle”元素中的数据感兴趣。我如何让它只从 XML 中反序列化这些数据?

最佳答案

基于 Ilya 的回答:

这可以稍微优化一下,因为已经有一个加载的节点:不需要将 xml 向下传递为字符串(使用 vehicle.ToString()),只需要引起序列化器必须重新解析它(使用 StringReader)。

相反,我们可以直接使用 XNode.CreateReader 创建一个阅读器:

private static T Deserialize<T>(XNode data) where T : class, new()
{
    if (data == null)
        return null;

    var ser = new XmlSerializer(typeof(T));
    return (T)ser.Deserialize(data.CreateReader());
}

或者如果数据是 XmlNode,则使用 XmlNodeReader:

private static T Deserialize<T>(XmlNode data) where T : class, new()
{
    if (data == null)
        return null;

    var ser = new XmlSerializer(typeof(T));
    using (var xmlNodeReader = new XmlNodeReader(data))
    {
        return (T)ser.Deserialize(xmlNodeReader);
    }
}

然后我们可以使用:

var vehicle = XDocument.Parse(xml)
                       .Descendants("Vehicle")
                       .First();

Vehicle v = Deserialize<Vehicle>(vehicle);

关于c# - 将嵌套的 XML 元素反序列化为 C# 中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16562332/

相关文章:

c# - 多线程文件搜索 C#

c# - Marshal.Copy/UnlockBits 挂起

c# - 在不终止应用程序的情况下处理全局异常?

xml - 错误 : Prefix must resolve to a namespace

java - 解析 xml 时如何检查空标签?

Python:忽略 elementtree.ElementTree 中的 xmlns

c# - 无法在 64 位操作系统上的 Visual Studio 中从 catch 设置下一条语句

c# - 如何在 C# 中的 List<string> 上切换大小写

c# - 运行时错误 : Could not load file or assembly - Modules with different CPU types were found

c# - 使用基于 GetHashCode 的 Equals 有什么负面影响吗?