我有以下XML结构(为了简洁而编辑),我无法控制它
<;GetVehicles>;
<;应用领域>;
<;发送方>;
<;诸如此类</诸如此类;
</发送方>;
</应用领域>;
<;数据区>;
<;错误>;
<;诸如此类</诸如此类;
</错误>;
<;车辆>;
<;车辆>;
<;颜色>;蓝色</颜色>;
<;NumOfDoors>;3</NumOfDoors>;
<;车身风格>;掀背式</车身风格>;
<;车辆>;
</车辆>;
</数据区>;
</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=反序列化<;车辆>;(车辆);