2 votes

La désérialisation en liste ne prend qu'un seul élément.

Voici à quoi ressemble mon XML :

<FileExtensions>
    <Text>
        <Extension>602</Extension>
        <Extension>ABW</Extension>
        <Extension>ACL</Extension>      
    </Text>
    <Script>
        <Extension>AHK</Extension>
        <Extension>APPLESCRIPT</Extension>      
    </Script>   
</FileExtensions>

Ce sont les classes que je désérialise :

    [XmlRoot("FileExtensions")]
    public class FileExtensions
    {
        public FileExtensions()
        {
            Text = new List<Extensions>();
            Script = new List<Extensions>();            
        }

        [XmlElement("Text")]
        public List<Extensions> Text;

        [XmlElement("Script")]
        public List<Extensions> Script;        
    }    
    public class Extensions
    {
        [XmlElement("Extension")]
        public string name;
    }

C'est comme ça que je désérialise :

FileExtensions extensions = new FileExtensions();
var deserializer = new System.Xml.Serialization.XmlSerializer(typeof(FileExtensions));
FileStream fs = new FileStream(filename, FileMode.Open);
XmlReader reader = new XmlTextReader(fs);
extensions = (FileExtensions)deserializer.Deserialize(reader);

Pour une raison quelconque, mes listes ne comportent qu'un seul élément chacune, qui est le premier à apparaître dans le fichier XML.

2voto

Chris Points 2253

Avec le Xml que vous avez, votre classe de définition actuelle ne correspond pas tout à fait à cause des noeuds intermédiaires. Si vous voulez que cela fonctionne, vous pouvez soit changer le xml en quelque chose comme ceci :

<FileExtensions>
    <Text>602</Text>
    <Text>ABW</Text>
    <Text>ACL</Text>      
    <Script>AHK</Script>
    <Script>APPLESCRIPT</Script>      
 </FileExtensions>

Et ensuite, modifiez votre Extension Classe pour décoarter le Name avec l'attribut [XmlText] pour capturer le texte à l'intérieur des nœuds.

Ou vous pouvez changer votre définition en quelque chose comme le suivant

 [XmlRoot("FileExtensions")]
public class FileExtensions
{
    [XmlElement("Text")]
    public Text Text;

    [XmlElement("Script")]
    public Script Script;
}

public class Text
{
    [XmlElement("Extension")]
    public List<Extensions> Texts;

    public Text()
    {
        Texts = new List<Extensions>();
    }
}

public class Script
{
    [XmlElement("Extension")]
    public List<Extensions> Scripts;

    public Script()
    {
        Scripts = new List<Extensions>();
    }
}

public class Extensions
{
    [XmlElement("Extension")]
    public string name;
}

Je l'ai utilisé dans une application de console et ça marche très bien. Vous avez un FileExtensions Objet, avec une nouvelle classe représentant chaque nœud Text y Script avec la liste des Extensions en leur sein.

2voto

Chris Points 15358

Essayez quelque chose comme ça :

[XmlArray("Text")]
[XmlArrayItem("Extension")]
public List<Extensions> Text;

[XmlArray("Script")]
[XmlArrayItem("Extension")]
public List<Extensions> Script;  

Il semble que ce soit la façon la plus courante de procéder d'après une rapide recherche sur le sujet sur Google.

0voto

sasjaq Points 447

Essayez de changer XmlElement en XmlArrayItem

    [XmlArrayItem("Text")]
    public List<Extensions> Text;

0voto

Brett Points 3384

Je ne pense pas que votre structure de classe reflète correctement votre structure xml. Quelque chose comme ceci fonctionne :

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            FileExtensions extensions = new FileExtensions();
            var deserializer = new System.Xml.Serialization.XmlSerializer(typeof(FileExtensions));
            FileStream fs = new FileStream(@"d:\temp\consoleapplication3\ConsoleApplication3\XMLFile1.xml", FileMode.Open);
            XmlReader reader = new XmlTextReader(fs);
            extensions = (FileExtensions)deserializer.Deserialize(reader);
        }
    }

    [XmlRoot("FileExtensions")]
    public class FileExtensions
    {
        public FileExtensions()
        {
        }

        [XmlElement("Text")]
        public Text Text { get; set; }
        [XmlElement("Script")]
        public Script Script { get; set; }
    }

    public class Text
    {
        [XmlElement("Extension")]
        public List<string> Extensions { get; set; }
    }

    public class Script
    {
        [XmlElement("Extension")]
        public List<string> Extensions { get; set; }
    }
}

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