2010-12-14 37 views
2

XML attendu Sortie:XmlSerializer - même élément avec des attributs différents

<add> 
<doc> 
    <field name="id">1</field> 
    <field name="Myname">MyName1</field1> 
</doc> 
<doc> 
    <field name="id">2</field> 
    <field name="Myname">MyName2</field> 
</doc> 
<doc> 
    <field name="id">3</field> 
    <field name="Myname">MyName3</field> 
</doc> 
</add> 

Pour obtenir le document XML ci-dessus, j'ai conçu la classe suivante

public class doc 
{ 
    [XmlElement("field")] 
    public ID Id 
    { 
     get; 
     set; 
    } 
    [XmlElement("field2")] 
    public Name Myname 
    { 
     get; 
     set; 
    } 
} 

classe nom sera

public class Name 
{ 
    [XmlText] 
    public string Namevalue 
    { 
     get; 
     set; 
    } 
    [XmlAttribute("name")] 
    public string Myname 
    { 
     get; 
     set; 
    } 
} 

Code XmlSerializer:

XmlSerializer serializer = new XmlSerializer(typeof(List<doc>), new XmlRootAttribute("add")); 

Cela me donne la sortie suivante

<add> 
<doc> 
    <field name="id">1</field> 
    <field2 name="Myname">MyName1</field2> 
</doc> 
<doc> 
    <field name="id">2</field> 
    <field2 name="Myname">MyName2</field2> 
</doc> 
<doc> 
    <field name="id">3</field> 
    <field2 name="Myname">MyName3</field2> 
</doc> 
</add> 

Ici, le field2 devrait être domaine Je sais que je dois changer la field2 comme champ dans doc classe mais cela entraîne une erreur.

Comment dois-je concevoir ma classe pour obtenir la sortie attendue?

Edit: classe ID regardera aussi comme classe nom avec ses propres attributs

+1

Qu'est-ce que la classe 'ID'? –

+0

@Saeed pl regarder edit –

+0

Question intéressante. J'ai besoin de cette information pour formater les données XML à utiliser avec une grille DHTMLX. –

Répondre

4

Quelque chose comme:

[XmlType("add"), XmlRoot("add")] 
public class WhateverAddIs { 
    private readonly List<Document> docs = new List<Document>(); 
    [XmlElement("doc")] 
    public List<Document> Documents { get { return docs; } } 
} 
public class Document { 
    private readonly List<Field> fields = new List<Field>(); 
    [XmlElement("field")] 
    public List<Field> Fields { get { return fields; } } 
} 
public class Field { 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    [XmlText] 
    public string Value { get; set; } 
} 

Puis:

class Program { 
    static void Main() { 
     var add = new WhateverAddIs { 
      Documents = { 
       new Document { 
        Fields = { 
         new Field { Name="id", Value ="1"}, 
         new Field { Name="Myname", Value ="Myname1"}, 
        }       
       }, new Document { 
        Fields = { 
         new Field { Name="id", Value ="2"}, 
         new Field { Name="Myname", Value ="Myname2"}, 
        } 
       }, new Document { 
        Fields = { 
         new Field { Name="id", Value ="3"}, 
         new Field { Name="Myname", Value ="Myname3"}, 
        } 
       } 
      } 
     }; 
     var ser = new XmlSerializer(add.GetType()); 
     ser.Serialize(Console.Out, add); 
    } 
} 
5

Deux options

[XmlRoot("doc")] 
    public class Doc 
    { 
     [XmlElement("field",Order = 1)] 
     public Field Id 
     { 
      get; 
      set; 
     } 
     [XmlElement("field", Order = 2)] 
     public Field Name 
     { 
      get; 
      set; 
     } 
    } 

    [XmlRoot("doc")] 
    public class Field 
    { 
     [XmlText] 
     public string Value 
     { 
      get; 
      set; 
     } 

     [XmlAttribute("name")] 
     public string Name 
     { 
      get; 
      set; 
     } 
    } 
enter code here 

cela produira des éléments dans l'ordre donné. Ou utilisez des tableaux comme

[XmlRoot("doc")] 
    public class Doc 
    { 
     [XmlArray("field")] 
     public Field[] Fields 
     { 
      get; 
      set; 
     } 
    }