Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XmlSerializer重命名平面xml数组中的数组项_C#_.net_Arrays_Xml Serialization_Rename - Fatal编程技术网

C# 使用XmlSerializer重命名平面xml数组中的数组项

C# 使用XmlSerializer重命名平面xml数组中的数组项,c#,.net,arrays,xml-serialization,rename,C#,.net,Arrays,Xml Serialization,Rename,我有一个XML文件,格式如下: <?xml version="1.0" encoding="UTF-8"?> <Items> <Item Property1="A" Property2="B" /> <Item Property1="C" Property2="D" /> </Items> 目前,我有以下代码来读取该文件: XmlSerializer serializer = new XmlSerializer

我有一个XML文件,格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<Items>
    <Item Property1="A" Property2="B" />
    <Item Property1="C" Property2="D" />
</Items>
目前,我有以下代码来读取该文件:

XmlSerializer serializer =
    new XmlSerializer(typeof(MyClass[]), new XmlRootAttribute(@"Items"));

MyClass[] list = (MyClass[])serializer.Deserialize(...);
由于元素名
与类名
MyCLass
不同,因此数组中的元素根本不会反序列化。如果我将
MyClass
重命名为
Item
,则上述代码可以工作,但不幸的是,不允许我更改XML文件或类名

如何映射这两者,以便正确读取文件


提前谢谢

就我个人而言,我会手动进行序列化和反序列化-我发现,通过这种方式更容易获得您想要的灵活性,而不是花很长时间在内置序列化上胡闹,忍受它强加的各种限制。LINQ到XML使它变得非常简单。例如,在这种情况下:

XDocument doc = XDocument.Load("test.xml");
// You could use an array if you really wanted, of course.
List<MyClass> list = doc.Root
                        .Elements("Item")
                        .Select(x => new MyClass {
                            Property1 = (string) x.Attribute("Property1"),
                            Property2 = (string) x.Attribute("Property2"),
                         })
                        .ToList();
XDocument doc=XDocument.Load(“test.xml”);
//当然,如果您真的需要,您可以使用数组。
List=doc.Root
.要素(“项目”)
.选择(x=>new MyClass{
Property1=(字符串)x.Attribute(“Property1”),
Property2=(字符串)x.Attribute(“Property2”),
})
.ToList();

诚然,如果您需要序列化具有复杂关系的对象(两个对象引用同一个子对象或其他对象),这将变得棘手,但我过去在这方面取得了很大的成功。

使用包含数组的包装类,这将允许您应用
xmlement
属性:

public class MyClassList
{
    [XmlElement("Item")]
    public MyClass[] Items { get; set; }
}

var items = new[]
{
    new MyClass { Property1 = "A", Property2 = "B" },
    new MyClass { Property1 = "C", Property2 = "D" },
};
var list = new MyClassList { Items = items };

using (var writer = new StringWriter())
{
    var xs = new XmlSerializer(typeof(MyClassList), new XmlRootAttribute("Items"));
    xs.Serialize(writer, list);
    writer.ToString().Dump();
}

但我不太清楚它为什么会起作用:-)我一直在寻找XmlArrayItem和XmlAttributeOverrides。再次感谢!谢谢你的提示!在我的例子中,实际的MyClass结构非常复杂,带有嵌套的层次结构-因此这种方法可能会变得有点复杂…@xmlWiz:如果您遵循一种模式,每个类都知道如何反序列化和序列化自己,我发现这并不太糟糕-而且很容易进行单元测试。但如果你有共同的参考资料等,它确实变得复杂。
public class MyClassList
{
    [XmlElement("Item")]
    public MyClass[] Items { get; set; }
}

var items = new[]
{
    new MyClass { Property1 = "A", Property2 = "B" },
    new MyClass { Property1 = "C", Property2 = "D" },
};
var list = new MyClassList { Items = items };

using (var writer = new StringWriter())
{
    var xs = new XmlSerializer(typeof(MyClassList), new XmlRootAttribute("Items"));
    xs.Serialize(writer, list);
    writer.ToString().Dump();
}