Прочитайте файл xml от конца до начала C#

У меня есть большие XML-файлы, в которых есть много данных (ненужных для меня сейчас) и очень большое количество процедур. Я хочу прочитать XML с конца, чтобы принять последнюю процедуру. (От последней ПРОЦЕДУРЫ СТАРТА до последней ПРОЦЕДУРЫ КОНЦА и всего, что между ними)

Я пытался с самого начала, но это неэффективно, потому что это занимает слишком много времени, чтобы пройти через все данные, и каждая процедура выполняется как последняя, ​​пока не будет найдена следующая.

Я также пытался читать построчное хранение в массиве, и с циклом for я начал искать с конца, но это тоже занимает много времени.

GetElementByTagName также бесполезен, потому что у меня много начальных и конечных процедур и не очень эффективен, если мне нужно пройти все из них.

XML-файлы имеют следующий формат: ............. ............. ............. <value> <struct> <member> <name> procedureAction </name> <value> 0 </value> </member> <member> <name> mainType </name> <value> 200 </value> </member> <member> <name> subType </name> <value> 30 </value> </member> <member> <name> time </name> <value> 1890 </value> </member> </struct> </value>

................. ................. ................. .................. <value> <struct> <member> <name> procedureAction </name> <value> 1 </value> </member> <member> <name> mainType </name> <value> 200 </value> </member> <member> <name> subType </name> <value> 30 </value> </member> <member> <name> time </name> <value> 1890 </value> </member> </struct> </value> ............. ............. ............. Значение actionAction равно 0 - START, значение actionAction равно 1 - END.

Как я могу прочитать XML-файл с конца? Итератор не работает, потому что ему нужно кодирование фиксированного размера.

Заранее спасибо.

Функция methodSearch разбивает xml, когда найдено имя элемента "methodAction", и сохраняет фрагмент в позиции в массиве. это делается для всех строк, которые содержат процедуру actionAction. Я пытался найти последнее "значение methodAction 0" в массиве, но отнимает слишком много времени "private string[] methodSearch(string inputXmlAsString){

    string[] returnValue = null;
    string[] split;
    string startSplit = "<value><struct><member><name>procedureAction</name><value>";
    string stopSplit = "</value></member></struct></value><value>";
    const int MAX_COUNT = 100000;
    string[] allResults = new string[MAX_COUNT];
    int allResultsCounter = 0;

    while (inputXmlAsString.CompareTo("") == 1) { 
        if (inputXmlAsString.Contains(startSplit)) {

            //if the text is contained in the remaining log...
            //split at the start (throw the split[0], keep split[1])
            split = inputXmlAsString.Split(new string[] { startSplit }, StringSplitOptions.RemoveEmptyEntries);
            string[] tempSplitter = null;
            //gather the remaining
            inputXmlAsString = string.Join(startSplit, split.Skip(1).ToList());
            //and split the remaining at the stop
            tempSplitter = inputXmlAsString.Split(new string[] { stopSplit }, StringSplitOptions.RemoveEmptyEntries);
            //connect from the start to the stop
            allResults[allResultsCounter] = startSplit + tempSplitter[0];
            string tempComp = stopSplit;
            tempSplitter = tempComp.Split(new String[] { "<value" }, StringSplitOptions.RemoveEmptyEntries);
            allResults[allResultsCounter] += tempSplitter[0];
            allResultsCounter++;

        } else {
            inputXmlAsString = "";
        }//if substring exists
        //Console.WriteLine("ReadLog after if: "+ readLog);

    }//while readLog not null

    returnValue = new string[allResultsCounter];
    for (int b = 0; b < allResultsCounter; b++) {
        returnValue[b] = allResults[b];
    }//for
    return returnValue;
}//end of procedureSearch function`

Основное очень просто:

string pieceOfXml = System.IO.File.ReadAllText(logPath); const int MAX = 100000; string[] allProcedures = new string[MAX]; int allProceduresCounter = 0; allProcedures = procedureSearch(pieceOfXml);

В результате получается массив с почти 3000 строками: пример фрагмента строки

<value><struct><member><name>procedureAction</name><value>20</value></member> <member><value><struct><member><name>mainType</name><value>31</value></member> <member><name>subType</name><value>0</value></member></struct></value></member> <member><name>time</name><value>97</value></member></member></struct></value>

0 ответов

Другие вопросы по тегам