XmlSerializer中有/不带XmlElement的不同行为

时间:2012-01-03 22:36:27

标签: c# xml xml-serialization

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
using System.Linq;

namespace Serialize
{    
    public class Good
    {
        public int a;
        public Good() {}

        public Good(int x)
        {
            a = x;
        }
    }

    public class Hello
    {
        public int x;
        public List<Good> goods = new List<Good>();

        public Hello()
        {
            goods.Add(new Good(1));
            goods.Add(new Good(2));
        }
    }

    [XmlRootAttribute("Component", IsNullable = false)]
    public class Component {
        //[XmlElement("worlds_wola", IsNullable = false)]
        public List<Hello> worlds;      

        public Component()
        {
            worlds = new List<Hello>() {new Hello(), new Hello()}; 
        }
    }

    class Cov2xml
    {
        static void Main(string[] args)
        {
            string xmlFileName = "ip-xact.xml";
            Component comp = new Component();

            TextWriter writeFileStream = new StreamWriter(xmlFileName);

            var ser = new XmlSerializer(typeof(Component));
            ser.Serialize(writeFileStream, comp);
            writeFileStream.Close();

        }
    }
}

使用这个XmlSerializer代码,我得到了这个XML文件。

enter image description here

我只有一个“worlds”元素,它有两个Hello元素。

但是,当我在worlds varibale之前添加XmlElement时。

[XmlElement("worlds_wola", IsNullable = false)]
public List<Hello> worlds

我有两个worlds_wola元素而不是一个。

enter image description here

这是为什么?如何使用XmlElement指定标记的名称,但只有一个“worlds_wola”元素,如下所示?

<worlds_wola>
  <Hello>
   ...
  </Hello>
  <Hello>
   ...
  </Hello>
</worlds_wola>

2 个答案:

答案 0 :(得分:3)

您需要为集合使用XmlArrayAttribute而不是XmlElementAttribute。

答案 1 :(得分:0)

根据Charles的回答,我发现这正是我想要的。

[XmlArray("fileSet")]
[XmlArrayItem(ElementName = "file", IsNullable = false)]
public List<Hello> worlds;   

通过此设置,我可以获得

<fileSet>
    <file>...</file>

而不是

<worlds>
    <Hello>...</Hello>