2009-11-21 5 views
0

C'est le document XML:XML groupe désérialisation d'objets

<?xml version="1.0" encoding="utf-8" ?> 
<ToolBars> 
    <ToolBarSet id="1" buttonsCounter="4" width="252"> 
     <ToolBarItem id="1" Command="Command11" Icon="pic11" Enabled="true" Visible="true" /> 
     <ToolBarItem id="2" Command="Command12" Icon="pic12" Enabled="true" Visible="true" /> 
     <ToolBarItem id="3" Command="Command13" Icon="pic13" Enabled="true" Visible="true" /> 
     <ToolBarItem id="4" Command="Command14" Icon="pic14" Enabled="false" Visible="true" />  
    </ToolBarSet> 
    <ToolBarSet id="2" buttonsCounter="2" width="170"> 
     <ToolBarItem id="1" Command="Command21" Icon="pic11" Enabled="true" Visible="true" /> 
     <ToolBarItem id="2" Command="Command22" Icon="pic22" Enabled="true" Visible="true" /> 
    </ToolBarSet> 
    </ToolBars> 

Je veux remplir les classes appropriées, voici mon code:
("publics" ne sont que pour le test)

class Program 
    { 
     static void Main(string[] args) 
     { 
      ToolBars test; 

      XmlSerializer mySerializer = new XmlSerializer(typeof(ToolBars)); 
      using (FileStream myFileStream = new FileStream("c:\\XMLFile1.xml", FileMode.Open)) 
      { 

       test = (ToolBars)mySerializer.Deserialize(myFileStream); 
      } 



     } 
    } 

    [Serializable] 
    [System.Xml.Serialization.XmlRoot("ToolBars")] 
    public class ToolBars 
    { 
     public int id; 
     public int buttonsCounter; 
     public int width; 

     [XmlArray("ToolBarSet")] 
     [XmlArrayItem("ToolBar", typeof(Toolbar))] 
     public List<Toolbar> toolbars = new List<Toolbar>();    

    } 

    [Serializable] 
    public class Toolbar 
    {  
     [XmlArray("ToolbarItem")] 
     [XmlArrayItem("ToolbarItem", typeof(ToolbarItem))] 
     public List<ToolbarItem> toolbarItems = new List<ToolbarItem>(); 

    } 

    [Serializable] 
    public class ToolbarItem 
    { 
     public string command; 

     public int id; 

     public string icon; 

     public bool visible; 

     public bool enabled; 

    } 

Comment le faire fonctionner?

+0

Le format XML peut-il être modifié ou doit-il fonctionner avec ce format précis? –

+0

plus ou moins le même format ... vous pouvez afficher le format que vous voulez et je vais vous dire si tout va bien. – samuel

Répondre

0

Vous pouvez utiliser ce format XML:

<?xml version="1.0" encoding="utf-8" ?> 
<ToolBarConfiguration> 
    <ToolBars> 
    <ToolBarSet id="1" buttonsCounter="4" width="252"> 
     <ToolBarItems> 
     <ToolBarItem 
      id="1" 
      Command="Command11" Icon="pic11" Enabled="true" Visible="true"/> 
     <ToolBarItem 
      id="2" 
      Command="Command12" Icon="pic12" Enabled="true" Visible="true"/> 
     <ToolBarItem 
      id="3" 
      Command="Command13" Icon="pic13" Enabled="true" Visible="true"/> 
     <ToolBarItem 
      id="4" 
      Command="Command14" Icon="pic14" Enabled="false" Visible="true"/> 
     </ToolBarItems> 
    </ToolBarSet> 
    <ToolBarSet id="2" buttonsCounter="2" width="170"> 
     <ToolBarItems> 
     <ToolBarItem 
      id="1" 
      Command="Command21" Icon="pic11" Enabled="true" Visible="true"/> 
     <ToolBarItem 
      id="2" 
      Command="Command22" Icon="pic22" Enabled="true" Visible="true"/> 
     </ToolBarItems> 
    </ToolBarSet> 
    </ToolBars> 
</ToolBarConfiguration> 

avec ces classes:

[Serializable] 
[XmlRoot("ToolBarConfiguration")] 
public class ToolBars 
{ 
    [XmlArray("ToolBars")] 
    [XmlArrayItem("ToolBarSet", typeof(Toolbar))] 
    public List<Toolbar> toolbars = new List<Toolbar>(); 
} 

[Serializable] 
public class Toolbar 
{ 
    [XmlAttribute("id")]public int id; 
    [XmlAttribute("buttonsCounter")]public int buttonsCounter; 
    [XmlAttribute("width")]public int width; 

    [XmlArray("ToolBarItems")] 
    [XmlArrayItem("ToolBarItem", typeof(ToolbarItem))] 
    public List<ToolbarItem> toolbarItems = new List<ToolbarItem>(); 
} 

[Serializable] 
public class ToolbarItem 
{ 
    [XmlAttribute("Command")]public string command; 
    [XmlAttribute("id")]public int id; 
    [XmlAttribute("Icon")]public string icon; 
    [XmlAttribute("Visible")]public bool visible; 
    [XmlAttribute("Enabled")]public bool enabled; 
} 

Edit: Dans votre question que vous dites aussi:

(« publics » ne sont que pour le test)

Soyez conscient que pour la sérialisation XML, seules les propriétés publiques et les champs d'un objet sont sérialisés.

0

Il suffit de remplacer vos classes avec celles-ci:

[XmlRoot("ToobBars")] 
public class ToolBars : List<ToolbarSet> 
{ 

} 

public class ToolbarSet 
{ 
    [XmlAttribute] 
    public int id { get; set; } 
    [XmlAttribute] 
    public int buttonsCounter { get; set; } 
    [XmlAttribute] 
    public int width { get; set; } 

    public List<ToolbarItem> ToolBarItems = new List<ToolbarItem>(); 
} 

public class ToolbarItem 
{ 
    [XmlAttribute] 
    public string command { get; set; } 
    [XmlAttribute] 
    public int id { get; set; } 
    [XmlAttribute] 
    public string icon { get; set; } 
    [XmlAttribute] 
    public bool visible { get; set; } 
    [XmlAttribute] 
    public bool enabled { get; set; } 
} 
+0

cela ne fonctionne pas – samuel

+0

@marc_s pas d'erreur, les objets restent vides – samuel

1

Qu'est-ce que vous pouvez toujours faire dans ce cas est

  • prendre le fichier XML et l'exécuter par xsd.exe sur la ligne de commande -> cela vous donne un fichier de schéma XSD
  • prendre cette nouvelle créé le fichier XSD et l'exécuter par xsd.exe avec le paramètre /c -> cela vous donne un fichier C# (utilisation/l: VB en plus si vous voulez VB.NET) qui sera en mesure de désérialiser votre XML

Tant que vous n'obtenez pas d'erreurs fatales pendant les deux exécutions de xsd.exe, vous devriez être prêt à partir et devriez pouvoir désérialiser n'importe quel XML en objets C# en une seconde.

Marc

+0

Je me déteste maintenant pour avoir perdu autant de temps à essayer de créer des fichiers C# à la main qui "s'adapteraient" à un xml. Merci .. Je vais essayer cet outil –

+0

J'ai pensé à l'utiliser mais j'ai décidé de ne pas utiliser d'outils externes, aussi les fichiers xml peuvent être modifiés et nécessiteront donc de faire tourner à nouveau l'outil lors de l'exécution. – samuel

+0

Eh bien, si le XML est lié à changer, l'utilisation de xsd.exe vous permettra d'économiser encore plus de temps! –