【发布时间】:2016-02-20 03:46:13
【问题描述】:
我知道将 xml 反序列化为 C# 类是很常见的事情,而且我以前做过。但是我收到了一个 XML 文件,其格式很难正确反序列化。当我从 XML 生成 C# 类时。我得到了我不想要的格式。基本上所有的属性都得到了列类型..
基本的 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# 类?
它完美地映射了自动生成的类,但它最终得到了一个列和 columnName 的列表..
有谁知道我是否可以在我的 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);
}
}
}
}
【问题讨论】:
-
告诉我们你已经尝试过什么?
-
向我们展示您用于反序列化的类。
标签: c# xml xml-parsing xmlserializer