在C中将嵌套的XML元素反序列化到类中#

我有以下XML结构(为了简洁而编辑),我无法控制它

<GetVehicles>
<应用领域>
<发送方>
<诸如此类&lt/诸如此类;
&lt/发送方>
&lt/应用领域>
<数据区>
<错误>
<诸如此类&lt/诸如此类;
&lt/错误>
<车辆>
<车辆>
<颜色>蓝色&lt/颜色>
<NumOfDoors>3&lt/NumOfDoors>
<车身风格>掀背式&lt/车身风格>
<车辆>
&lt/车辆>
&lt/数据区>
&lt/GetVehicles>

我有以下课程:

[XmlRoot(“GetVehicles”)、XmlType(“Vehicle”)]
公车
{
公共字符串颜色{get;set;}
公共字符串numofoors{get;set;}
公共字符串BodyStyle{get;set;}
}

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

不幸的是,XML数据当前没有映射到我的类属性;在调用我的反序列化方法时,它们被保留为空

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

私有静态T反序列化<T>(字符串数据),其中T:class,new()
{
if(string.IsNullOrEmpty(数据))
返回null;
var ser=新的XmlSerializer(typeof(T));
使用(var sr=新的StringReader(数据))
{
返回(T)序列反序列化(sr);
}
}

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

以伊利亚的回答为基础:

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

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

私有静态T反序列化<T>(XNode数据),其中T:class,new()
{
如果(数据==null)
返回null;
var ser=新的XmlSerializer(typeof(T));
返回(T)序列反序列化(data.CreateReader());
}

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

私有静态T反序列化<T>(XmlNode数据),其中T:class,new()
{
如果(数据==null)
返回null;
var ser=新的XmlSerializer(typeof(T));
使用(var xmlNodeReader=newxmlnodereader(数据))
{
返回(T)序列反序列化(xmlNodeReader);
}
}

然后,我们可以使用:

var vehicle=XDocument.Parse(xml)
.后代(“车辆”)
.First();
车辆v=反序列化<车辆>(车辆);

发表评论