C# 对象序列化为XML,其元素名称具有序列号
我已经使用XmlSerializer.Serialize(…)方法实现了对象序列化,以将我的对象转换为XML字符串 目前,序列化程序正在生成以下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&
<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元素命名为
,
似乎有点奇怪。此遗留系统是第三方系统还是内置系统?我会问旧系统的开发者为什么会做出这样的选择。是的,这有点奇怪。。。看来我必须使用搜索和替换策略。谢谢你,伙计!