我知道将xml反序列化为C#类是一种常见的事情,我以前也做过。但是我收到了一个XML文件,其中的格式让我很难正确地进行反序列化。当我从XML生成C#类时,我得到了一种我不想要的格式。基本上,所有属性都得到了列类型。
基本的XML格式如下所示。问题是我有250个属性,我真的不想手动映射每一个属性。
基本的XML格式如下所示。问题是我有250个属性,我真的不想手动映射每一个属性。
<item table="Order">
<column columnName="Id"><![CDATA[2]]></column>
<column columnName="Price"><![CDATA[200]]></column>
<column columnName="Date"><![CDATA[25-01-2036 13:29:24:310]]>
我实际上手动编写了一个具有正确属性的类,如Id
、price
、date
等等...
我尝试添加ElementName
和AttributeName
,但没有成功。我是否可以使用XmlSerializer
直接将其映射到C#类中?
它完美地映射了自动生成的类,但最终得到了一系列列和列名。
是否有人知道我是否可以通过在我的C#类上使用一些xml注释来修复它以正确映射?
-------------- 解决方案 --------------
感谢@Dan Field让我走上了正确的轨道!
正如他自己指出的那样,他的解决方案中存在可空属性的问题。所以我找到了另一个解决方案,这就是我想到的!
public void ReadXml(XmlReader reader)
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "column")
{
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(EcomOrder));
string propName = reader.GetAttribute("columnName");
// Retrieve the property Descriptor
PropertyDescriptor prop = props[propName];
if (prop != null)
{
reader.Read(); // move to CDATA (or text) node
// use DateTime.ParseExact instead for DateTime field
if (prop.PropertyType == typeof(DateTime?) || prop.PropertyType == typeof(DateTime))
{
prop.SetValue(this,
DateTime.ParseExact(reader.Value, "dd-MM-yyyy HH:mm:ss:fff", CultureInfo.InvariantCulture));
}
else
{
prop.SetValue(this,
prop.Converter.ConvertFromInvariantString(reader.Value));
}
}
else
{
throw new XmlException("Property not found: " + propName);
}
}
}
}