Comment désérialiser ce document XML:
<?xml version="1.0" encoding="utf-8"?>
<Cars>
<Car>
<StockNumber>1020</StockNumber>
<Make>Nissan</Make>
<Model>Sentra</Model>
</Car>
<Car>
<StockNumber>1010</StockNumber>
<Make>Toyota</Make>
<Model>Corolla</Model>
</Car>
<Car>
<StockNumber>1111</StockNumber>
<Make>Honda</Make>
<Model>Accord</Model>
</Car>
</Cars>
J'ai ceci:
[Serializable()]
public class Car
{
[System.Xml.Serialization.XmlElementAttribute("StockNumber")]
public string StockNumber{ get; set; }
[System.Xml.Serialization.XmlElementAttribute("Make")]
public string Make{ get; set; }
[System.Xml.Serialization.XmlElementAttribute("Model")]
public string Model{ get; set; }
}
.
[System.Xml.Serialization.XmlRootAttribute("Cars", Namespace = "", IsNullable = false)]
public class Cars
{
[XmlArrayItem(typeof(Car))]
public Car[] Car { get; set; }
}
.
public class CarSerializer
{
public Cars Deserialize()
{
Cars[] cars = null;
string path = HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data/") + "cars.xml";
XmlSerializer serializer = new XmlSerializer(typeof(Cars[]));
StreamReader reader = new StreamReader(path);
reader.ReadToEnd();
cars = (Cars[])serializer.Deserialize(reader);
reader.Close();
return cars;
}
}
qui ne semblent pas fonctionner :-(
Réponses:
Voici une version de travail. J'ai changé les
XmlElementAttribute
étiquettesXmlElement
parce que dans le xml les valeurs StockNumber, Make et Model sont des éléments, pas des attributs. J'ai également supprimé lereader.ReadToEnd();
(cette fonction lit le flux entier et renvoie une chaîne, de sorte que laDeserialize()
fonction ne pouvait plus utiliser le lecteur ... la position était à la fin du flux). J'ai également pris quelques libertés avec la dénomination :).Voici les cours:
La fonction Désérialiser:
Et le xml légèrement modifié (j'avais besoin d'ajouter un nouvel élément pour envelopper <Cars> ... Net est difficile à désérialiser les tableaux):
la source
[Serializable]
est redondant en cas d'utilisationXmlSerializer
;XmlSerializer
ne vérifie simplement jamais cela. De même, la plupart des[Xml...]
attributs sont redondants, car ils imitent simplement le comportement par défaut; c'est-à-dire que par défaut une propriété appeléeStockNumber
est stockée sous la forme d'un élément nommé<StockNumber>
- pas besoin d'attributs pour cela.Que diriez-vous d'enregistrer le fichier XML dans un fichier et d'utiliser xsd pour générer des classes C #?
xsd foo.xml
xsd foo.xsd /classes
Et voila - et un fichier de code C # qui devrait pouvoir lire les données via
XmlSerializer
:(inclure les foo.cs générés dans le projet)
la source
Vous avez deux possibilités.
Méthode 1. Outil XSD
Supposons que vous ayez votre fichier XML à cet emplacement
C:\path\to\xml\file.xml
Vous pouvez le trouver dans
Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools
Ou si vous avez Windows 8, vous pouvez simplement commencer à taper l' invite de commande du développeur dans l' écran Démarrercd /D "C:\path\to\xml"
xsd file.xml
xsd /c file.xsd
Et c'est tout! Vous avez généré des classes C # à partir d'un fichier xml dans
C:\path\to\xml\file.cs
Méthode 2 - Collage spécial
Visual Studio 2012+ requis
Edit > Paste special > Paste XML As Classes
Et c'est tout!
Usage
L'utilisation est très simple avec cette classe d'assistance:
Il ne vous reste plus qu'à:
la source
Paste XML As Classes
commande ne cible que .NET 4.5L'extrait suivant devrait faire l'affaire (et vous pouvez ignorer la plupart des attributs de sérialisation):
...
la source
Voyez si cela aide:
.
À défaut, utilisez le programme xsd.exe fourni avec Visual Studio pour créer un document de schéma basé sur ce fichier XML, puis réutilisez-le pour créer une classe basée sur le document de schéma.
la source
Je ne pense pas que .net soit «pointilleux sur la désérialisation des tableaux». Le premier document xml n'est pas bien formé. Il n'y a pas d'élément racine, bien qu'il semble y en avoir. Le document XML canonique a une racine et au moins 1 élément (le cas échéant). Dans votre exemple:
la source
essayez ce bloc de code si votre fichier .xml a été généré quelque part sur le disque et si vous avez utilisé
List<T>
:Remarque:
C:\serialize.xml
est le chemin de mon fichier .xml. Vous pouvez le changer selon vos besoins.la source
L'anser de Kevin est bon, mis à part le fait que dans le monde réel, vous n'êtes souvent pas en mesure de modifier le XML d'origine en fonction de vos besoins.
Il existe également une solution simple pour le XML d'origine:
Et puis vous pouvez simplement appeler:
la source
Essayez cette classe générique pour la sérialisation et la désérialisation Xml.
la source
Pour les débutants
J'ai trouvé les réponses ici très utiles, cela dit que j'avais encore du mal (juste un peu) à faire fonctionner cela. Donc, au cas où cela aiderait quelqu'un, je définirai la solution de travail:
XML de la question d'origine. Le xml est dans un fichier Class1.xml, un
path
à ce fichier est utilisé dans le code pour localiser ce fichier xml.J'ai utilisé la réponse de @erymski pour que cela fonctionne, j'ai donc créé un fichier appelé Car.cs et ajouté ce qui suit:
L'autre morceau de code fourni par @erymski ...
... va dans votre programme principal (Program.cs),
static CarCollection XCar()
comme ceci:J'espère que cela aide :-)
la source
Que diriez-vous d'une classe générique pour désérialiser un document XML
Cette partie peut être nécessaire ou non. Ouvrez le document XML dans Visual Studio, faites un clic droit sur le XML, choisissez les propriétés. Choisissez ensuite votre fichier de schéma.
la source
Bon mot:
la source
L'idée est de gérer tous les niveaux pour la désérialisation. Veuillez consulter un exemple de solution qui a résolu mon problème similaire.
Le XML ci-dessus est géré en deux niveaux
Le niveau intérieur
De la même manière, vous avez besoin de plusieurs niveaux avec
car as array
Vérifiez cet exemple pour la désérialisation à plusieurs niveauxla source
Si vous obtenez des erreurs en utilisant xsd.exe pour créer votre fichier xsd, utilisez la classe XmlSchemaInference comme mentionné sur msdn . Voici un test unitaire pour démontrer:
la source
Vous pouvez simplement changer un attribut pour votre propriété de voiture Cars de XmlArrayItem à XmlElment. Autrement dit, à partir de
à
la source
Ma solution:
Edit > Past Special > Paste XML As Classes
pour obtenir la classe dans votre codeList<class1
>), puis utilisez leXmlSerializer
pour sérialiser cette liste dans unxml
fichier.deserialize
.Code:
REMARQUE: vous devez faire attention au nom racine, ne le changez pas. Le mien est "ArrayOfClass1"
la source
la source