[英]C# Deserialize XML file to List
我想將 XML 反序列化為對象列表。
這是我的頂級 C# 課程:
[XmlRoot("Events")]
[XmlType("Events")]
[Serializable]
public class WinEventLogList
{
public WinEventLogList() { Items = new List<WinEventLog>(); }
[XmlElement("Event")]
public List<WinEventLog> Items { get; set; }
}
[XmlRoot("Event")]
[XmlType("Event")]
[Serializable]
public class WinEventLog
{
[XmlElement("System")]
[JsonPropertyName("system")]
public EventSystem System { get; set; } = new EventSystem();
[XmlElement("EventData")]
[JsonPropertyName("eventData")]
public EventData EventData { get; set; } = new EventData();
}
這是我需要反序列化的示例 XML:
<?xml version="1.0" encoding="utf-8"?>
<Events>
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>Omitted tags go in here</System>
<EventData>Omitted tags go in here</EventData>
</Event>
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>Omitted tags go in here</System>
<EventData>Omitted tags go in here</Event>
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>Omitted tags go in here</System>
<EventData>Omitted tags go in here</EventData>
</Event>
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>Omitted tags go in here</System>
<EventData>Omitted tags go in here</EventData>
</Event>
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>Omitted tags go in here</System>
<EventData>Omitted tags go in here</EventData>
</Event>
</Events>
這是我嘗試過的兩種不同方法,都來自這個 stackoverflow 問題。
首先,嘗試使用包裝器 class WinEventLogList
using var stream = File.OpenRead("path/to/my/xml/file.xml");
using var reader = new StreamReader(stream);
var serializer = new XmlSerializer(typeof(WinEventLogList));
var list = serializer.Value.Deserialize(reader) as WinEventLogList;
var winEventLogs = list.Items;
然后,嘗試在序列化程序中直接使用普通List
。
using var stream = File.OpenRead("path/to/my/xml/file.xml");
using var reader = new StreamReader(stream);
var serializer = new XmlSerializer(
typeof(List<WinEventLog>),
new XmlRootAttribute("Events"));
var winEventLogs = serializer.Value.Deserialize(reader) as List<WinEventLog>;
在這兩種情況下,生成的winEventLogs
變量都是一個空列表。 為什么會這樣? 如何糾正?
XML 的一個經常被忽視的組件是名稱空間。 它們實際上是 [反] 序列化過程中不可或缺的一部分。
您幾乎就在那里,只需在 object 中指定名稱空間以匹配 XML。
這是一個工作片段:
void Main() {
using var reader = new StringReader(xmlStr);
var serializer = new XmlSerializer(typeof(WinEventLogList));
var list = (WinEventLogList)serializer.Deserialize(reader)!;
list.Dump();
}
[XmlRoot("Events")]
public class WinEventLogList {
// Namespaces are extremely important!
[XmlElement("Event", Namespace="http://schemas.microsoft.com/win/2004/08/events/event")]
public List<WinEventLog> Items { get; set; } = new();
}
public class WinEventLog {
[XmlElement] public int System { get; set; }
[XmlElement] public int EventData { get; set; }
}
string xmlStr = """
<?xml version='1.0' encoding='utf-8'?>
<Events>
<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
<System>1</System> <EventData>2</EventData>
</Event>
<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
<System>3</System> <EventData>4</EventData>
</Event>
</Events>
""";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.