【问题标题】:XML Serialization List of ObjectsXML 序列化对象列表
【发布时间】:2015-06-15 18:14:03
【问题描述】:

查看关于 XML 序列化的 Microsoft 文章:

https://msdn.microsoft.com/en-us/library/58a18dwa.aspx

他们在“序列化对象数组”下给出了一个示例,如下所示:

public class PurchaseOrder
{
    public Item [] ItemsOrders
}

public class Item
{
    public string ItemID
    public decimal ItemPrice
}

有输出:

<PurchaseOrder>
    <Items>
        <Item>
            <ItemID>aaa111</ItemID>
            <ItemPrice>34.22</ItemPrice>
        </Item>
        <Item>
            <ItemID>bbb222</ItemID>
            <ItemPrice>2.89</ItemPrice>
        </Item>
    </Items>
</PurchaseOrder>

困扰我的是“项目”标签。在我看来,只有“Item”标签应该是“PurchaseOrder”的子标签。 “项目”标签似乎不必要且令人困惑。我可能是错的。

有没有办法让这个例子像这样序列化:

<PurchaseOrder>
    <Item>
        <ItemID>aaa111</ItemID>
        <ItemPrice>34.22</ItemPrice>
    </Item>
    <Item>
        <ItemID>bbb222</ItemID>
        <ItemPrice>2.89</ItemPrice>
    </Item>
</PurchaseOrder>

【问题讨论】:

  • 假设您有两个集合:订单和发票。您需要一个 &lt;Orders&gt; 元素和一个 &lt;Invoices&gt; 元素。

标签: c# xml serialization xml-serialization


【解决方案1】:

您可以使用属性控制序列化。来自“Controlling XML Serialization using Attributes”:要删除代表整个数组的元素,请使用[XmlElement] 属性:

public class Group{
    [XmlElement]
    public Employee[] Employees;
}

这会产生

<Group>
    <Employees>
        <Name>Haley</Name>
    </Employees>
    <Employees>
        <Name>Noriko</Name>
    </Employees>
    <Employees>
        <Name>Marco</Name>
    </Employees>
</Group>

【讨论】:

  • 使用XmlElement 将抑制“收藏”元素。如果您想要集合元素,请使用XmlArray 属性以便对集合进行序列化,并使用XmlArrayItem 来控制单个项目被序列化时的名称和类型。反序列化也是如此。
【解决方案2】:

您可以使用XmlElement 属性来指定要为每个项目使用的名称:

namespace ConsoleApplication1
{
    using System;
    using System.IO;
    using System.Xml.Serialization;

    internal class Program
    {
        private static void Main(string[] args)
        {
            var order = new PurchaseOrder { ItemsOrders = new Item[2] };

            order.ItemsOrders[0] = new Item { ItemID = "1", ItemPrice = 1723 };
            order.ItemsOrders[1] = new Item { ItemID = "2", ItemPrice = 4711 };

            var serializer = new XmlSerializer(typeof(PurchaseOrder));

            using (var writer = new StringWriter())
            {
                serializer.Serialize(writer, order);

                Console.WriteLine(writer.ToString());
            }
        }
    }

    public class PurchaseOrder
    {
        [XmlElement("Item")]
        public Item[] ItemsOrders { get; set; }
    }

    public class Item
    {
        public string ItemID { get; set; }

        public decimal ItemPrice { get; set; }
    }
}

<?xml version="1.0" encoding="utf-16"?>
<PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Item>
    <ItemID>1</ItemID>
    <ItemPrice>1723</ItemPrice>
  </Item>
  <Item>
    <ItemID>2</ItemID>
    <ItemPrice>4711</ItemPrice>
  </Item>
</PurchaseOrder>
Press any key to continue . . .

【讨论】:

    猜你喜欢
    • 2020-10-31
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多