С# ASP.Net обработка XML ОЧЕНЬ быстро вывести содержимое ноды где препредыдущая нода равна значению.

программирование .net asp

Схема такая (только меня запаривать если она кривая не надо - чо дали с тем и работаю, не моя схема, я бы так не делал, считаю что АйДи должны быть зашиты в атрибут).
<elements_list xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="СекретнаяСХема">
<uin>некийхэшкод</uin>
<elements>
<element>
<element_id>11111</element_id>
<element_title>Маша и мячик</element_title>
<element_name>Наша Маша громко плачет уронила в речку Мячик.</element_name>
</element>
... тут целая масса нодов
<element>
<element_id>11118</element_id>
<element_title>Саша и сушка</element_title>
<element_name>Шла Саша по шоссе и сосала сушку</element_name>
</element>
</elements>
<timestamp xsi:nil="true" />
</elements_list>
Нужен самый скоростной способ выбрать содержимое ноды element_name у которой нода element_id = 11118.
Т.е. в довольно объемном хмле (порядка 8Мб) нужно быстро выдернуть или весь куст <element> с определенным element_id но еще лучше выдернуть содержимое element_name у которой element_id = 11118
LINQ не пойдет, надо еще быстрее.
Перебор нод я думаю не пойдет, медленно. Если не согласны - аргументируйте.
Рабочему коду или конкретному ответу ЛО.

Примечание:
Регексом читать ХМЛ когда в .Net масса методов для чтения XML структуры? Хотя надо попробовать, что то в этом есть...
strpos + substr? Неа, .Net C# - пхп мимо.
Побайтовое чтение структурированного документа? Вы уверены? ОК, тогда как загнать ХМЛ в массив байтов где каждый element_id будет точно в заданных адресах? Может я и нуб, но для успешного побайтового чтения наверное должна быть четкая адресная структура где каждый набор данных имеет четкий размер. Слабо представляю как слить в массив байтов строки element_name, element_title абсолютно рандомного размера не имеющие предела размера.
Свой алгоритм вычленения, да круто, уже всю бошку сломал...
Дихотомия. Забавно. Мне не надо сортировать и дробить массив мне нужно быстро получить срез массива где в срезе имеется элемент с определенным значением.

Примечание:
" Одноразовый поиск, тогда быстрее линейного поиска врядли что-то можно придумать"
Да одноразовый. Запрос ноды и в ответ из ХМЛ нужно дернуть ноду с запрошенным значением(текст) element_id и в этой же ветке ноду с именем element_name и вывести внутренний текст element_name.

Примечание:
PetSerAl (Сергей Петров)
Да я пока до такого изящного решения не додумался бы...
Ответы:
regex ?
strpos + substr?
Побайтовое чтение + свой алгоритм вычленения объекта из XML?
Уточните, что Вам нужно. Одноразовый поиск, тогда быстрее линейного поиска врядли что-то можно придумать, или много запросов с разными element_id, тогда загоняйте всё в хеш таблицу Dictionary<TKey,TValue> и дёргайте из неё.
2 Дополнение #2
Тогда Вам в любом случае придётся прочитать файл и обработать все ноды до нужной Вам:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
internal static class Test{
   private static void Main(){
       try{
           XNamespace xns="СекретнаяСХема";
           int id=int.Parse(Console.ReadLine());
           XElement xe=EnumerateElements("Test.xml","element","СекретнаяСХема").FirstOrDefault(e=>(int)e.Element(xns+"element_id")==id);
           Console.WriteLine(xe==null?"Нет такого елемета.":(string)xe.Element(xns+"element_name"));
       }catch(Exception e){
           Console.WriteLine(e);
       }
       Console.ReadKey(true);
   }
   private static IEnumerable<XElement> EnumerateElements(string file,string name,string ns){
       using(XmlReader reader=XmlReader.Create(file)){
           while(reader.ReadToFollowing(name,ns)){
               do{
                   yield return (XElement)XNode.ReadFrom(reader);
               }while(reader.IsStartElement(name,ns));
           }
       }
   }
}


12 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.