如何将EventRecord xml转换为字典包括所有参数-C#



我有以下xml,其中包括windows事件:

<?xml version="1.0"?> -
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="LMS" />
<EventID Qualifiers="32768">2125</EventID>
<Level>4</Level>
<Task>3</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2021-05-30T14:05:07.077547800Z" />
<EventRecordID>89958</EventRecordID>
<Channel>Application</Channel>
<Computer></Computer>
<Security/>
</System>
<EventData>
<Data> </Data>
</EventData>
</Event>

我想把这个XML转换成c#中的字典,它工作得很好,但问题是在";提供者名称";以及";timeCreated";我收到的属性为空。

我怎么能得到这样的值;LMS";以及";2021-05-30T14:05:07.077547800Z"?

以下是将XML转换为字典的代码:

var xmlFile = File.ReadAllText(log);
XDocument doc = XDocument.Parse(xmlFile);
Dictionary<string, string > dataDictionary = new Dictionary <string, string >();
foreach(XElement element in doc.Descendants().Where(p => p.HasElements ==false)) 
{
int keyInt = 0;
string keyName = element.Name.LocalName;
while (dataDictionary.ContainsKey(keyName))
{
keyName = element.Name.LocalName + "_" + keyInt++;
}
dataDictionary.Add(keyName,
element.Value);
}

以下检查XML节点是否有任何属性,如果有,将获取属性的值,并用nodeName_attributeName:格式的关键字添加字典的值

var xmlFile = File.ReadAllText(log);
XDocument doc = XDocument.Parse(xmlFile);
Dictionary<string, string > dataDictionary = new Dictionary <string, string >();
foreach(XElement element in doc.Descendants().Where(p => p.HasElements ==false)) 
{
int keyInt = 0;
string keyName = element.Name.LocalName;
while (dataDictionary.ContainsKey(keyName))
{
keyName = element.Name.LocalName + "_" + keyInt++;
}
dataDictionary.Add(keyName, element.Value);
if (element.HasAttributes)
{
var lmsAttribute = element.FirstAttribute;
if (lmsAttribute != null)
{
dataDictionary.Add($"{keyName}_{lmsAttribute.Name.LocalName}", lmsAttribute.Value);
}
}
}

最终字典如下:

{
"Provider": "",
"Provider_Name": "LMS",
"EventID": "2125",
"EventID_Qualifiers": "32768",
"Level": "4",
"Task": "3",
"Keywords": "0x80000000000000",
"TimeCreated": "",
"TimeCreated_SystemTime": "2021-05-30T14:05:07.077547800Z",
"EventRecordID": "89958",
"Channel": "Application",
"Computer": "",
"Security": "",
"Data": ""
}

请参阅此DotNetFiddle以获取演示

最新更新