我知道將xml反序列化爲C#類是很常見的事情,我之前就已經完成了。但是,ive收到了一個格式爲im的XML文件,該格式很難正確反序列化。當我從XML生成一個C#類。我得到了我不想要的格式。基本上所有的屬性獲得列類型。將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#類嗎?
它完美地映射自動生成的類,但它與colums和列名的列表,結束了..
不要任何人都知道,如果我能有可能修復這個對我的C#類中的一些XML的符號來得到它太映射正確?
-------------- --------------解決
感謝@丹現場爲我安排在正確的軌道上!
他指出自己在解決方案中存在可空屬性的問題。所以我找到了另一個,這就是我想出來的!
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);
}
}
}
}
告訴我們你已經試過了嗎? – CodeNotFound
向我們展示您正在用於反序列化的類。 – CodeNotFound