如何使用 XMLSerializer 生成 XML?

How to generate an XML using XMLSerializer?

我想使用 XMLSerializer 生成一个 XML。我有一个抽象的 Base class 被其他 classes 继承。

 public abstract class Base
    {
      public string Name {get; set;}
      public int ID {get; set;}

      public Base(string Name, int ID)
      {
         this.Name = Name;
         this.ID = ID;
      }
    }



 public class HR: Base
    {      
      public HR(string Name, int ID): Base(Name,ID)
      {
      }
    }

    public class IT : Base
    {
      public IT(string Name, int ID): Base(Name,ID)
      {
      }
    }

我不确定如何生成 XML 格式

<Employee>
 <HR>
  <Name> </Name>
  <ID> </ID>
 </HR>
 <IT>
  <Name> </Name>
  <ID> </ID>
 </IT>
</Employee>

对于这个模糊的问题,我深表歉意。我以前从未使用过 XMLSerializer,也不确定如何使用它。任何帮助将不胜感激。

谢谢

将 [Serializable] 注释添加到要序列化的 class。

        [System.Serializable]
        public class Base
        {
        public string Name { get; set; }
        public int ID { get; set; }

        public Base(string Name, int ID)
            {
            this.Name = Name;
            this.ID = ID;
            }
        }

要以 XML 格式序列化,请使用以下代码:

        System.Xml.Serialization.XmlSerializer Serializer = new System.Xml.Serialization.XmlSerializer(typeof(Base));
        Base Foo = new Base();
        string xmldata = "";

        using (var stringwriter = new System.IO.StringWriter())
        {
            using (System.Xml.XmlWriter xmlwriter = System.Xml.XmlWriter.Create(stringwriter))
            {
                Serializer.Serialize(xmlwriter, Foo);
                xml = stringwriter.ToString(); // Your XML
            }
        }

要从 XML 反序列化回您的 Base 对象,请使用以下代码:

        System.IO.MemoryStream FooStream = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml));
        Base Foo;
        Foo = (Base)Serializer.Deserialize(FooStream);

我认为您需要使用 XmlType 属性来确保您的元素显示为 <HR><IT> 而不是 <employee xsi:type="HR">。下面的工作演示:

public abstract class Employee
{
    public string Name { get; set; }
    public string ID { get; set; }

    public Employee(string Name, string ID)
    {
        this.Name = Name;
        this.ID = ID;
    }
}

public class HR : Employee
{
    public HR(string Name, string ID) : base(Name, ID)
    {
    }


    public HR() : base("No name", "No ID")
    {

    }
}

public class IT : Employee
{
    public IT(string Name, string ID) : base(Name, ID)
    {
    }

    public IT() : base("No name", "No ID")
    {

    }
}   

我为序列化程序添加了默认(无参数)构造函数。

然后你必须有某种包装器对象来处理 Employees 的列表:

public class Employees
{
    [XmlElement(typeof(IT))]
    [XmlElement(typeof(HR))]
    public List<Employee> Employee { get; set; } //It doesn't really matter what this field is named, it takes the class name in the serialization
}

接下来,您可以使用我评论中的序列化程序代码来生成 XML:

var employees = new Employees
{
    Employee = new List<Employee>()
    {
        new IT("Sugan", "88"),
        new HR("Niels", "41")
    }
};

var serializer = new XmlSerializer(typeof(Employees));
var xml = "";

using (var sw = new StringWriter())
{
    using (XmlWriter writer = XmlWriter.Create(sw))
    {
        serializer.Serialize(writer, employees);
        xml = sw.ToString();
    }
}
Console.WriteLine(xml);

(为清楚起见省略了命名空间)

这个returns下面XML:

<?xml version="1.0" encoding="UTF-8"?>
<Employees xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <IT>
      <Name>Sugan</Name>
      <ID>88</ID>
   </IT>
   <HR>
      <Name>Niels</Name>
      <ID>41</ID>
   </HR>
</Employees>

当我阅读您的 xml 时,您似乎想要序列化一个 Employee 列表。 如果您的列表是 class 的成员(不直接序列化列表),我有一个解决方案。

public abstract class Employee
{
    public string Name { get; set; }
    public int ID { get; set; }
    public Employee(string Name, int ID)
    {
        this.Name = Name;
        this.ID = ID;
    }
}

public class HR : Employee
{
    public HR() : base(null, 0) { } // default constructor is needed for serialization/deserialization
    public HR(string Name, int ID) : base(Name, ID) { }
}
public class IT : Employee
{
    public IT() : base(null, 0) { }
    public IT(string Name, int ID) : base(Name, ID) { }
}

public class Group
{
    [XmlArray("Employee")]
    [XmlArrayItem("HR",typeof(HR))]
    [XmlArrayItem("IT",typeof(IT))]
    public List<Employee> list { get; set; }

    public Group()
    {
        list = new List<Employee>();
    }
}
class Program
{
    static void Main(string[] args)
    {
        Group grp = new Group();
        grp.list.Add(new HR("Name HR", 1));
        grp.list.Add(new IT("Name IT", 2));

        XmlSerializer ser = new XmlSerializer(typeof(Group));
        ser.Serialize(Console.Out, grp);
    }
}

输出为:

<?xml version="1.0" encoding="ibm850"?>
<Group xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Employee>
    <HR>
      <Name>Name HR</Name>
      <ID>1</ID>
    </HR>
    <IT>
      <Name>Name IT</Name>
      <ID>2</ID>
    </IT>
  </Employee>
</Group>

与您想要的输出非常相似,只是根部多了一个元素 "Group"。

使用相同的 XmlSerializer(typeof(Group)) 进行反序列化也应该有效。