524 votes

Comment faire pour le document XML à désérialiser

Comment pour désérialiser ce document XML :

J’ai ceci :

.

.

qui ne semble pas fonctionner  :-(

485voto

Marc Gravell Points 482669

Que diriez vous juste enregistrez le code xml dans un fichier et utilisez xsd?

  1. Écrire le fichier sur le disque (je l’ai nommé foo.xml)
  2. Générer le xsd :``
  3. Générer le langage c# :``

Et voilà - et le fichier de code c# qui devrait être capable de lire les données via `` :

(inclure le foo.cs généré dans le projet)

386voto

Kevin Tighe Points 5573

Voici une version de travail. J'ai changé le XmlElementAttribute étiquettes à XmlElement parce que dans le xml de la StockNumber Modèle, la marque et les valeurs sont des éléments, non pas les attributs. Aussi j'ai enlevé le lecteur.ReadToEnd(); (cette fonction lit le flux entier et retourne une chaîne de caractères, de sorte que le Deserialze() la fonction ne pouvais pas utiliser le lecteur de...plus la position a à la fin du flux). J'ai aussi pris quelques libertés avec le nom :).

Voici les catégories:

[Serializable()]
public class Car
{
    [System.Xml.Serialization.XmlElement("StockNumber")]
    public string StockNumber { get; set; }

    [System.Xml.Serialization.XmlElement("Make")]
    public string Make { get; set; }

    [System.Xml.Serialization.XmlElement("Model")]
    public string Model { get; set; }
}


[Serializable()]
[System.Xml.Serialization.XmlRoot("CarCollection")]
public class CarCollection
{
    [XmlArray("Cars")]
    [XmlArrayItem("Car", typeof(Car))]
    public Car[] Car { get; set; }
}

Le Désérialiser fonction:

CarCollection cars = null;
string path = "cars.xml";

XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));

StreamReader reader = new StreamReader(path);
cars = (CarCollection)serializer.Deserialize(reader);
reader.Close();

Et légèrement tordu xml (j'ai besoin d'ajouter un nouvel élément à envelopper <Voiture>...Net est pointilleux sur la désérialisation des tableaux):

<?xml version="1.0" encoding="utf-8"?>
<CarCollection>
<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>
</CarCollection>

261voto

Damian Drygiel Points 3230

Vous avez deux possibilités.

Méthode 1. XSD outil


Supposons que vous avez votre fichier XML dans cet emplacement C:\path\to\xml\file.xml

  1. Ouvrir Développeur Invite De Commande
    Vous pouvez le trouver en Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools Ou si vous avez Windows 8 pouvez commencer à taper le Développeur de l'Invite de Commande dans l' écran de Démarrage
  2. Modifier l'emplacement de votre fichier XML du répertoire en tapant cd /D "C:\path\to\xml"
  3. Créer le fichier XSD à partir de votre fichier xml en tapant xsd file.xml
  4. Créer des classes C# en tapant xsd /c file.xsd

Et c'est tout! Vous avez généré des classes C# à partir du fichier xml en C:\path\to\xml\file.cs

Méthode 2 - collage spécial


Requis Visual Studio 2012+

  1. Copier le contenu de votre fichier XML dans le presse-papiers
  2. Ajouter à votre solution nouvelle, vider le fichier de classe (Maj+Alt+C)
  3. Ouvrez ce fichier et dans le menu, cliquez sur Edit > Paste special > Paste XML As Classes
    enter image description here

Et c'est tout!

L'utilisation de la


L'utilisation est très simple avec cette classe d'assistance:

using System;
using System.IO;
using System.Web.Script.Serialization; // Add reference: System.Web.Extensions
using System.Xml;
using System.Xml.Serialization;

namespace Helpers
{
    internal static class ParseHelpers
    {
        private static JavaScriptSerializer json;
        private static JavaScriptSerializer JSON { get { return json ?? (json = new JavaScriptSerializer()); } }

        public static Stream ToStream(this string @this)
        {
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);
            writer.Write(@this);
            writer.Flush();
            stream.Position = 0;
            return stream;
        }


        public static T ParseXML<T>(this string @this) where T : class
        {
            var reader = XmlReader.Create(@this.Trim().ToStream(), new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document });
            return new XmlSerializer(typeof(T)).Deserialize(reader) as T;
        }

        public static T ParseJSON<T>(this string @this) where T : class
        {
            return JSON.Deserialize<T>(@this.Trim());
        }
    }
}

Tout ce que vous avez à faire maintenant, c'est:

    public class JSONRoot
    {
        public catalog catalog { get; set; }
    }
    // ...

    string xml = File.ReadAllText(@"D:\file.xml");
    var catalog1 = xml.ParseXML<catalog>();

    string json = File.ReadAllText(@"D:\file.json");
    var catalog2 = json.ParseJSON<JSONRoot>();

25voto

Joel Coehoorn Points 190579

Voir si cela aide à :

.

Sinon utiliser le programme xsd.exe fourni avec visual studio pour créer un document de schéma basé sur ce fichier xml, et puis l’utiliser à nouveau pour créer une classe basée sur le document de schéma.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X