Je sais que la désérialisation des classes XML en C# est une chose courante et je l'ai déjà fait. Mais ive a reçu un fichier XML avec un format im ayant du mal à se désérialiser correctement. Quand je génère une classe C# à partir du XML. Je reçois un format que je ne veux pas. Fondamentalement toutes les propriétés obtiennent le type de colonne.Mappage du fichier XML dans une classe C#
Le format XML de base est comme ci-dessous. Le fait est que j'ai 250 propriétés et je ne veux vraiment pas cartographier manuellement chacun d'entre eux.
<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]]>
J'ai effectivement écrit manuellement une classe qui a les bonnes propriétés. Id
, price
, date
et ainsi de suite ...
J'ai essayé avec l'ajout ElementName
et AttributeName
sans chance. Est-il possible pour moi de mapper ceci directement à une classe C# en utilisant XmlSerializer
?
Il mappe parfaitement la classe autogenerated mais il se retrouve avec une liste de colonnes et columnName ..
Ne quelqu'un sait si je peux possible résoudre ce avec quelques notations xml sur mon C# classe pour obtenir la carte trop bien ?
-------------- -------------- Solution
Merci à @ Dan pour moi d'obtenir le terrain sur la bonne voie! Comme il le fait remarquer lui-même, il y avait un problème avec les attributs Nullable dans sa solution
J'ai donc chassé un autre et c'est ce que j'ai trouvé!
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);
}
}
}
}
Montrez-nous ce que vous avez déjà essayé? – CodeNotFound
Montrez-nous la classe que vous utilisez pour la désérialisation. – CodeNotFound