Разбор записей журнала:
Попробуйте что-то вроде этого:
public static IList<string> ParseLogs(string log_file_string)
{
// The pattern of the beginning of each log entry
var logprefixPattern = @"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z \[data_type_(jason|xml)\] ";
// Replace it with a symbol
var splitPattern = "[log_entry]";
var replaced = Regex.Replace(log_file_string, logprefixPattern, splitPattern);
// Split the string with that symbol
var splited = replaced.Split(splitPattern);
// Now you get the list of logs.
return splited;
}
Моя идея заключается в том, что вы читаете все содержимое и сохраняете его в переменной log_file_string
, вы можете посмотреть для шаблона каждого журнала вместо того, чтобы читать его построчно.
Похоже, что каждая запись журнала начинается с одного и того же шаблона, поэтому вы можете разделить запись журнала по этому шаблону.
Если вы хотите разделить элементы на 2 группы: xml журналы и json журналы, вы можете oop разделить результаты один за другим и определить их, например, по начальному символу ({
равно json и <
- это xml).
Анализ XML внутри записи журнала
Предполагается, что вы хотите преобразовать XML в список json строк и каждая строка - это человек, вы можете использовать Newtonsoft.Json
:
public static IList<string> ParseXml(string xmlStr)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlStr);
// assuming that each entry contains at least 1 person, and you want to extract those persons
var ppl = doc.GetElementsByTagName("person");
var results = new List<string>{};
foreach(XmlNode p in ppl)
{
string jsonStr = Newtonsoft.Json.JsonConvert.SerializeXmlNode(p);
results.Add(jsonStr);
}
return results;
}
Для простоты я просто возвращаю здесь json строки. Вы можете десериализовать jsonStr
в некоторую модель C#, которую вы определили.