Это невозможно сделать, не делая существенных предположений о характере вашего текста. Прежде всего, вы должны предположить, что это хорошо сформированный XML и что он не содержит разделов CDATA и пространств имен.
Если вы начинаете в любом месте посреди потока и создаете резервную копию, пока не нажмете то, что кажется началом элемента, вы не можете знать, что текст, на который вы смотрите, фактически - начало элемента. Это может быть CDATA. И вы не можете сказать, что это не CDATA, пока вы не отбросили весь поток, ищущий <![CDATA[
и не нашли его.
Пространства имен представляют собой аналогичную проблему. Если вы найдете начальный тег, например <Foo
, вы не можете точно знать, что Foo
находится в пространстве имен по умолчанию, пока вы не вернетесь полностью к корневому элементу документа и не убедитесь, что элемент предка не имеет объявления пространства имен. Если вы найдете <x:Foo
, вам нужно отступить, пока не найдете закрытый элемент с объявлением xmlns:x
.
Если вы точно знаете, что текст хорошо сформированный XML, что он не содержит CDATA и что его использование пространств имен ограничено (то есть вы можете указать, какое пространство имен находится в элементе, просто взглянув на его start tag), то некоторые из того, что вы пытаетесь сделать, по крайней мере, возможны.
Вы можете создать резервную копию до первого начального тега, с которым вы сталкиваетесь, создать StreamReader
, чье происхождение это положение, и использовать его для создания XPathDocument
, который настроен для обработки фрагментов документа.Обратите внимание, кстати, что у вас нет уверенности, что XPathDocument
не будет читать весь путь до конца текста в первый раз, когда вы его используете, кроме того, у вас есть знания о характере текста, и вы знаете, что будет присутствовать соответствующий конечный тег.
Но это не будет обрабатывать конкретный случай, который вы упомянули, т. Е. Находите родительский элемент. Чтобы найти родительский элемент, вам нужно будет найти начальный тег, которому не предшествует (по мере продвижения назад) соответствующий тег конца. Это не очень сложно сделать - каждый найденный вами персонаж <
станет началом либо стартового тега, либо конечного тега, либо пустого элемента, и вы можете просто положить теги конца в стек и выскочить, когда вы найдете их соответствующий начальный тег. Когда вы нажимаете начальный тег, и стек пуст, вы находитесь в начале родительского элемента.
Но это тоже процесс, который может привести к вашим возвратам всего пути происхождения ручья, особенно в тривиальном случае, когда XML вы ищете является классический идиотским форматом журнал XML:
<log>
<entry>...</entry>
<entry>...</entry>
... повторяется до бесконечности
Можете ли вы привести пример того, как я могу использовать его для достижения этого? В обычном способе использования XPathDocument я все равно передаю ему целую строку, не указывая, где должен начинаться синтаксический анализ строки. – kdt
Я добавил пример. Просто передайте всю строку и выполните ваши запросы XPath, чтобы выбрать интересующие узлы. Полагаться, что текстовое смещение не кажется хорошей идеей. В большинстве случаев XPathDocument должен работать с разумной производительностью. Поэтому, прежде чем пытаться написать собственный синтаксический анализатор, я бы попробовал и посмотрел, получится ли вам достаточно быстрый результат (написание собственного анализатора может показаться немного недопустимым). Также обратите внимание, что производительность может быть оптимизирована путем тонкой настройки запросов XPath. –
Хорошо, поэтому XPathDocument не то, что я ищу - это не общая скорость или эффективность, а конкретный случай, когда я знаю, где в тексте, который я хочу начать, и я хочу полностью избежать поиска в другом месте , Например, у меня есть часть файла, и получение каких-либо других частей будет включать в себя хранение с высокой задержкой, например, ленточный робот. – kdt