Как преобразовать XML — файл записи событий в словарь, включающий все параметры- C#

#c# #xml

Вопрос:

У меня есть следующий 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#, он работает нормально, но проблема в том, что в свойствах «Имя поставщика» и «Время создания» я получаю значение null.

Есть идеи, как я могу получить такие значения, как: «LMS» и «2021-05-30T14:05:07.077547800 Z» ?

Вот код для преобразования 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);
} 

Ответ №1:

Следующее проверяет, есть ли у 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 для демонстрации