gpt4 book ai didi

c# - 使用一个类(反)序列化不同的根元素名称

转载 作者:太空狗 更新时间:2023-10-29 17:43:26 25 4
gpt4 key购买 nike

我有几个根元素不同但子元素类型相同的 XML 文件,我希望能够创建一个类来保存不同的根元素,另一个类来保存每个子元素。下面是 XML 文件外观的两个示例。

文件 1:

<?xml version="1.0" encoding="utf-8" ?>
<Sandra>
<Address>
<Street></Street>
<Number></Number>
</Address>
</Sandra>

文件 2:

<?xml version="1.0" encoding="utf-8" ?>
<John>
<Address>
<Street></Street>
<Number></Number>
</Address>
</John>

我希望能够仅使用 2 个类对它进行序列化和反序列化,例如:

[Serializable]
[XmlRoot]
public class Person
{
[XmlElement("Address")]
public List<Address> Adresses { get; set; }
}

[Serializable]
public class Address
{
public string Street { get; set; }

public string Number { get; set; }
}

我尝试使用以下方法阅读它们:

    var ser = new XmlSerializer(typeof(Person));
var reader = XmlReader.Create("person1.xml");
var person = (Person)ser.Deserialize(reader);

但我得到 "There is an error in XML document (2, 2)." ,因为反序列化器期待一个 <"Person">根元素而不是 <"John"><"Paul"> .如果我改变 [XmlRoot] 它工作正常至 [XmlRoot("John")]但这正是我在这里要避免的。

此外,我必须能够使用同样奇怪的 XML 结构将其序列化,因此我需要将根元素名称存储在 Person 类中。

我知道我可以简单地创建我自己的(反)序列化器,但我想知道是否可以使用现有方法实现它。

编辑 1:(回滚)。

编辑 2: 回滚“编辑 1”的修改,因为我找到了一种更简单的方法来实现我的需要。请参阅下面我的回答。

最佳答案

找到了一种简洁快速的方法来解决我的问题!在实例化 XmlSerializer 时,我只需要使用 XmlRootAttribute。这样我就可以在运行时设置根元素的名称。

var personsName = "Sandra";
var ser = new XmlSerializer(typeof(Person),
new XmlRootAttribute { ElementName = personsName });
var reader = XmlReader.Create("person1.xml");
var person = (Person)ser.Deserialize(reader);

当然如果我想序列化也是一样的。

关于c# - 使用一个类(反)序列化不同的根元素名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17658436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com