2010-12-14 55 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> 

这里场2应该我知道自己需要改变文档场2但是这会导致错误。

我应该如何设计我的班级以获得预期的输出?

编辑: ID级别也会像名称类都有自己的属性

+1

什么是'ID'类? – 2010-12-14 11:12:27

+0

@Saeed pl看看编辑 – 2010-12-14 11:14:15

+0

有趣的问题。我需要此信息来格式化XML数据以与DHTMLX网格一起使用。 – 2011-03-30 19:02:43

回答

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; 
     } 
    } 
相关问题