C# 对象序列化为XML,其元素名称具有序列号

C# 对象序列化为XML,其元素名称具有序列号,c#,xml,asp.net-mvc,C#,Xml,Asp.net Mvc,我已经使用XmlSerializer.Serialize(…)方法实现了对象序列化,以将我的对象转换为XML字符串 目前,序列化程序正在生成以下XML: <MyAddress> <row> <Home>1</Home> <Office>2</Office> </row> <row> <Home>1</Home> <Office&

我已经使用XmlSerializer.Serialize(…)方法实现了对象序列化,以将我的对象转换为XML字符串

目前,序列化程序正在生成以下XML:

<MyAddress>
  <row>
    <Home>1</Home>
    <Office>2</Office>
  </row>
  <row>
    <Home>1</Home>
    <Office>2</Office>
  </row>
  <row>
    <Home>1</Home>
    <Office>2</Office>
  </row>
</MyAddress>

1.
2.
1.
2.
1.
2.
但我希望生成以下XML:

<MyAddress>
  <row1>
    <Home>1</Home>
    <Office>2</Office>
  </row1>
  <row2>
    <Home>1</Home>
    <Office>2</Office>
  </row2>
  <row3>
    <Home>1</Home>
    <Office>2</Office>
  </row3>
</MyAddress>

1.
2.
1.
2.
1.
2.
我的C#代码中使用的类如下所示:

namespace MyApp
{
    public class MyAddress
    {
        public List<row> Rows { get; set; }
    }


    public class row
    {
        public string Home { get; set; }
        public string Office { get; set; }
    }
}
名称空间MyApp
{
公共类MyAddress
{
公共列表行{get;set;}
}
公共类行
{
公共字符串Home{get;set;}
公共字符串办公室{get;set;}
}
}

有什么建议吗?

我建议您使用
xmldattribute
您的
类来存储索引,然后对项目进行排序。下面是一个例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;

public class Program
{
    private static void Main(string[] args)
    {
        var address = new MyAddress();

        address.Rows = new List<Row>();

        var rows = new List<Row>();
        rows.Add(new Row { Home = "Home A" });
        rows.Add(new Row { Home = "Home B" });
        rows.Add(new Row { Home = "Home B" });

        var items = rows.Select((x, index) => new Row 
        {
            Home = x.Home,
            Office = x.Office,
            Index = ++index
        });

        address.Rows.AddRange(items);

        var xmlS = new XmlSerializer(typeof(MyAddress));
        xmlS.Serialize(Console.Out, address);
    }
}

public class MyAddress
{
    public MyAddress()
    {
        Rows = new List<Row>();
    }

    public List<Row> Rows { get; set; }
}

public class Row
{
    [XmlAttribute]
    public int Index { get; set; }

    public string Home { get; set; }

    public string Office { get; set; }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Xml.Serialization;
公共课程
{
私有静态void Main(字符串[]args)
{
var address=新的MyAddress();
address.Rows=新列表();
var rows=新列表();
添加(新行{Home=“Home A”});
添加(新行{Home=“Home B”});
添加(新行{Home=“Home B”});
变量项=行。选择((x,索引)=>新行
{
Home=x.Home,
办公室,办公室,
索引=++索引
});
address.Rows.AddRange(项目);
var xmlS=新的XmlSerializer(typeof(MyAddress));
序列化(Console.Out,地址);
}
}
公共类MyAddress
{
公共广播()
{
行=新列表();
}
公共列表行{get;set;}
}
公共类行
{
[XmlAttribute]
公共int索引{get;set;}
公共字符串Home{get;set;}
公共字符串办公室{get;set;}
}
这将产生以下XML:

<MyAddress>
  <row Index="1">
    <Home>1</Home>
    <Office>2</Office>
  </row>
  <row Index="2">
    <Home>1</Home>
    <Office>2</Office>
  </row>
  <row Index="3">
    <Home>1</Home>
    <Office>2</Office>
  </row>
</MyAddress>

1.
2.
1.
2.
1.
2.

你不能。要实现这一点,您需要实现自己的XML序列化程序/反序列化程序。“行”上的“rowNumber”属性是否更容易处理?@ChrisMcAtackney,甚至是
属性。问题是要序列化列表中的索引。@ChrisMcAtackney没有……我知道在row元素中使用属性会更好。。。我正在尝试复制遗留应用程序生成的XML。这可能对我的场景没有帮助,我正在尝试重新生成遗留应用程序中的XML。更改xml结构将使现有的xml变得无用。这是一种棘手的情况,因为您无法通过XmlSerialization实现所需的功能。我建议您使用我的代码,然后运行另一个算法,将
替换为
。一种搜索和替换。换言之,将上述代码生成的XML读入一个字符串(逐行或一个字符串,由您选择),然后对
元素进行搜索/替换。这有意义吗?作为旁注,将XML元素命名为
似乎有点奇怪。此遗留系统是第三方系统还是内置系统?我会问旧系统的开发者为什么会做出这样的选择。是的,这有点奇怪。。。看来我必须使用搜索和替换策略。谢谢你,伙计!