Я знаю, что десериализация классов xml на C# является обычной практикой, и я делал это раньше. Но ive получил XML-файл с форматом im, который имеет жесткое десериализацию. Когда я генерирую класс 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
не повезло. Возможно ли мне сопоставить это непосредственно с классом C#, используя XmlSerializer
?
Он прекрасно отображает сгенерированный класс, но он заканчивает со списком colums и ColumnName ..
ли кто-нибудь знает, если я могу возможно исправить это с некоторой XML нотацией на моем C# класса, чтобы получить его слишком карту правильно ?
-------------- Solution --------------
Благодаря @Dan поле для получения меня на верном пути!
, поскольку он указывает на то, что в его решении возникла проблема с атрибутами с нулевым значением. Так что я охотился на другого, и это то, что я придумал!
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