gpt4 book ai didi

c# - Linq XML to Object,其中 xml 节点具有嵌套元素

转载 作者:行者123 更新时间:2023-11-30 20:14:48 25 4
gpt4 key购买 nike

我需要生成一个 List<Event>来自 XML 文档,以及 Event有一个 List<Contact> .如何将 XML 转换为 List<Event>阅读时的对象:

这是我的事件类:

public class Event
{
public string id { get; set; }
public string title { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public virtual List<Contact> contacts { get; set; }
}

接触类

public class Contact
{

public int Id { get; set; }
public string Name { get; set; }
}

这就是我在用户添加内容时保存 XML 文档的方式。

<Event>
<id>1</id>
<title>AA</title>
<start>2019-12-01T14:13:58.863</start>
<end>2019-12-01T15:13:58.787</end>
<contacts>

<contact>
<id>1</id>
<name>ABC</name>
</contact>

<contact>
<id>2</id>
<name>ABCD</name>
</contact>

<contact>
<id>3</id>
<name>ABCDE</name>
</contact>

</contacts>
</Event>

获取我使用的XML文档

XDocument xml = new XDocument();
xmlDoc = XDocument.Load("Data.xml");

我对如何将项目读取到列表中感到震惊。我该怎么做?

最佳答案

假设您的 xml 的根称为事件:

<?xml version="1.0" encoding="UTF-8"?>
<Events>
<Event>
<id>1</id>
<title>AA</title>
<start>2019-12-01T14:13:58.863</start>
<end>2019-12-01T15:13:58.787</end>
<contacts>
<contact>
<id>1</id>
<name>ABC</name>
</contact>
<contact>
<id>2</id>
<name>ABCD</name>
</contact>
<contact>
<id>3</id>
<name>ABCDE</name>
</contact>
</contacts>
</Event>
<Event>
<id>2</id>
<title>AA</title>
<start>2019-12-02T14:13:58.863</start>
<end>2019-12-02T15:13:58.787</end>
<contacts>
<contact>
<id>4</id>
<name>DEF</name>
</contact>
<contact>
<id>5</id>
<name>BNH</name>
</contact>
<contact>
<id>6</id>
<name>KLK</name>
</contact>
</contacts>
</Event>
</Events>

您可以定义以下两个表示 XML 文档结构的类:

[XmlType("Event")]
public class Event
{
[XmlElement("id")]
public string Id { get; set; }
[XmlElement("title")]
public string Title { get; set; }
[XmlElement("start")]
public DateTime Start { get; set; }
[XmlElement("end")]
public DateTime End { get; set; }
[XmlArray("contacts")]
public virtual List<Contact> Contacts { get; set; }
}

[XmlType("contact")]
public class Contact
{
[XmlElement("id")]
public int Id { get; set; }

[XmlElement("name")]
public string Name { get; set; }
}

然后您可以反序列化您的 XML,如下所示:

using (var reader = new StreamReader(filename))
{
var deserializer = new XmlSerializer(typeof(List<Event>), new XmlRootAttribute("Events"));
return (List<Event>) deserializer.Deserialize(reader);
}

您必须将 filename 替换为您的 xml 文件所在的路径。

如果我们假设您已经选择了要复制到输出目录的 xml - 右键单击​​文件并检查它的属性以检查或设置它 - 那么您可以很容易地获得它的路径,如下所示(假设它叫做 events.xml):

var outputDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
var filename = Path.Combine(outputDirectory, @"events.xml");

为了让您掌握 XmlSerializer,我建议您从 XmlSerializer 开始并继续这个 Examples of XML Serialization .

关于c# - Linq XML to Object,其中 xml 节点具有嵌套元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59124970/

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