Выберите HTML из определенной позиции, используя Html Agility Pack

c# html html-agility-pack xpath

Вопрос

Мне нужно получить html-текстовые узлы, например, с строки 64, позицию линии 45 до строки 183, позицию строки 22. Я довольно новичок в XPath, и я не совсем уверен, каковы мои варианты. Как мне продолжить? Я имел в виду что-то вроде этого:

var nodes=doc.DocumentNode.SelectNodes("//text()[position() > startPosition and position() < endPosition]");

Принятый ответ

Класс HtmlNode имеет два важных атрибута (для чего вам нужно сделать):

  • Line (линия, где начинается узел)
  • LinePosition (линия, где заканчивается узел)

Вы могли бы сделать что-то вроде:

var nodes = doc.DocumentNode.Descendants("#text").Where(
    x => (x.Line > 64 || (x.Line == 64 && x.LinePosition >= 45)) &&
         (x.Line < 183 || (x.Line == 183 && x.LinePosition <= 22))
);

конечно, вы также можете сделать doc.DocumentNode.SelectNodes("//text()").Where(...)

Одна проблема, с которой вам придется иметь дело:

Он не говорит вам, где заканчивается узел, поэтому приведенное выше решение может дать вам узлы, которые заканчиваются на линии выше 183 или в строке 183 но в положении, превышающем 22 . Для этого вы можете использовать свойство OuterHtml узла и выполнять некоторые манипуляции с строками (получить длину, чтобы узнать, где она заканчивается, разделить на \n чтобы узнать, сколько строк и т. Д.).


Популярные ответы

Вы не можете сделать это с помощью XPath: он ничего не знает о номерах строк и позициях символов в XML.

Функция position() возвращает относительное положение узла в списке узлов - например, возвращает 1 для первого узла в списке, 2 для второго и т. Д.

Чтобы получить информацию о позиции линии, вы можете анализировать XML с помощью XElement или XmlReader, а затем использовать интерфейс IXmlLineInfo .

Обратите внимание, что использование позиций строки / символа для идентификации фрагментов XML-файла проблематично: процессоры XML регулярно переформатируют XML, добавляя / удаляя пробелы и конечные строки, и поэтому один и тот же фрагмент XML может изменить положение.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow