В скрипте для программы-оболочки «Windows PowerShell» версии 5.1 (или «PowerShell» версии 7) в операционной системе «Windows 10» я получаю текст из файла с кодом на языке HTML для дальнейшего анализа. С помощью библиотеки «HTML Agility Pack» превращаю этот текст в объект $dom, содержащий HTML-дерево, представляющее исходный файл. После этого я задумался о том, что, если я при анализе HTML-дерева найду какую-нибудь ошибку, мне понадобится вывести сообщение об этой ошибке в консоль. А в этом сообщении хотелось бы указать местонахождение ошибки в исходном файле. То есть хотелось бы указать номер строки исходного файла, в которой содержится ошибка, а также номер позиции в строке (номер столбца), с которого начинается узел HTML-дерева, содержащий ошибку. Эта информация должна быть получена при конвертации исходного файла в объект $dom. Сначала я хотел сам написать это, а затем догадался посмотреть в описании библиотеки «HTML Agility Pack» — в ней уже есть эта функциональность! У каждого узла есть свойства Line и LinePosition, содержащие нужные номер строки и номер столбца (позиции в строке). Я временно изменил код обработки узла при обходе HTML-дерева, чтобы увидеть эти номера: После этого скрипт выдал у меня такой результат (тестовый исходный файл с кодом на языке HTML можно увидеть в одной из предыдущих статей, он примитивный): Видно, что что-то пошло не так: для всех узлов HTML-дерева указана одна и та же строка с номером 1, хотя в исходном файле узлы находятся в строках с разными номерами. Через некоторое время я сообразил: я сам получаю текст из исходного файла в переменную $html типа System.String. То есть я сам преобразовал текст исходного файла в строку, потеряв данные о структуре исходного файла. Кроме метода LoadHtml объекта класса HtmlAgilityPack.HtmlDocument, который принимает аргумент типа System.String, в библиотеке «HTML Agility Pack» у объекта класса HtmlAgilityPack.HtmlDocument есть и другие методы для загрузки исходного кода на языке HTML. Например, один из них называется Load и может принимать строку с путем к исходному файлу и сведения о его кодировке. Этот метод сам получит данные из исходного файла и правильно прочитает информацию о его структуре (номера строк и номера столбцов). Использование этого метода даже немного упростит мой скрипт: мне не нужно будет самому получать данные из исходного файла. Итак, вносим изменение в скрипт (переменная $file содержит строку (System.String) с путем к исходному файлу, путь может быть как абсолютным, так и относительным): После этого изменения скрипт выдал у меня такой результат: Теперь всё в порядке, можно проверить по исходному файлу: Замечу, что свойство Line узла HTML-дерева выдает нумерацию строк, начиная с единицы, а вот свойство LinePosition выдает нумерацию позиций в строке, начиная с нуля. Поэтому в скрипте пришлось к номеру позиции в строке (номеру столбца) каждый раз прибавлять единицу (см. код выше в статье). Эта информация будет полезна тем, кто, как и я, начинает работать с библиотекой «HTML Agility Pack». Лично мне было сложно выбрать между методами LoadHtml и Load для загрузки исходного кода на языке HTML, так как я изначально не понимал, какая между ними может быть разница (кроме той, что эти методы принимают разные входные параметры). Выше я продемонстрировал одно из отличий. Возможно, есть и другие. Документация по библиотеке «HTML Agility Pack» на сайте проекта очень бедна и неполна. Постоянно приходится шерстить файл «HtmlAgilityPack.xml» с описанием классов, содержащихся в библиотеке (этот файл довольно большой, я получил его вместе с библиотекой).