Puisque vous avez mentionné que les données XML proviennent de sources externes, vous n'avez évidemment aucun contrôle sur ces données.
Par conséquent, vous pouvez suivre l'une des options comme ci-dessous:
- Créer une classe séparée par structure de données XML, parce que jusqu'à présent, je sais qu'il n'y a aucun moyen de contrôler XML Désérialisation lors de l'utilisation
XmlSerializer
- Vous pouvez utilisez
XDocument
pour lire le code XML par vous-même, afin de surmonter cette limitation.
Si j'y vais par seconde idée, j'ai créé une petite application console pour le démontrer.
pièce principale de code est comme ci-dessous:
MemoryStream xmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlData));
XDocument doc = XDocument.Load(xmlStream);
var records = from record in doc.Descendants("item").Descendants()
select new Item(!record.IsEmpty ? record.Value : record.Attribute("value").Value);
Ici, je lis l'élément à l'aide LinqToXml et vérifier si l'élément est pas vide, ce Value
est pas vide, puis utilisez Value
lire autrement la valeur de Attribute
de l'élément.
application Console (code complet):
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Xml.Serialization;
namespace Console.TestApp
{
class Program
{
static string xmltypeFirst = @"<item>
<name>John</name>
</item>";
static string xmltypeSecond = @"<item>
<name value='Smith' />
</item>";
static void Main(string[] args)
{
var data = xmltypeFirst;
var result = Deserialize(data).ToList();
Console.WriteLine("Name: " + result[0].Name);
data = xmltypeSecond;
result = Deserialize(data).ToList();
Console.WriteLine("Name: " + result[0].Name);
Console.WriteLine("Press any to key to exit..");
Console.ReadLine();
}
private static IEnumerable<Item> Deserialize(string xmlData)
{
MemoryStream xmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlData));
XDocument doc = XDocument.Load(xmlStream);
var records = from record in doc.Descendants("item").Descendants()
select new Item(!record.IsEmpty ? record.Value : record.Attribute("value").Value);
return records;
}
}
[Serializable]
public class Item
{
public Item(string name)
{
this.Name = name;
}
[XmlElement("name")]
public string Name { get; set; }
}
}
Remarque: Pour exécuter cela, vous devrez ajouter une référence à System.Xml.Linq.dll
dans votre projet.
Référence: here
IMO ce n'est pas possible. Vous devrez finaliser le format des fichiers XML d'entrée. C'est une question intéressante cependant. – niksofteng