2010-12-14 6 views
2

Ожидаемый XML Вывод:XmlSerializer - тот же элемент с различными атрибутами

<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> 

Чтобы получить вышеуказанный документ XML, я разработал следующий класс

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

класс Имя будет

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

XmlSerializer Код:

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

Это дает мне следующий вывод

<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> 

Здесь FIELD2 должен быть поле Я знаю, что нужно изменить field2 как поле в док класса но это приводит к ошибке.

Как мне создать класс для получения ожидаемого результата?

Edit: ID класс также будет выглядеть как класс имен со своими атрибутами

+1

Что такое класс 'ID'? –

+0

@Saeed pl посмотреть на редактирование –

+0

Интересный вопрос. Мне нужна эта информация для форматирования XML-данных для использования с сетью DHTMLX. –

ответ

4

Что-то вроде:

[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; } 
} 

Тогда:

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

Два опционных

[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 

это будет производить элементы в заданном порядке. Или используйте такие массивы, как

[XmlRoot("doc")] 
    public class Doc 
    { 
     [XmlArray("field")] 
     public Field[] Fields 
     { 
      get; 
      set; 
     } 
    } 
Смежные вопросы