re: test () XPath to HtmlAgilityPack (получить все теги p с внутренним регулярным выражением)

c# html html-agility-pack xpath

Вопрос

Я хочу все теги <p>=.+=</p> . Regex работает самостоятельно, без тегов <p> .

Вот мой XPath: "//p[re:test(.,'^=.+=$', 'i')]"

Но я получаю исключение, когда я подключаю его,

HtmlNodeCollection pNodes = htmlDoc.DocumentNode.SelectNodes("//p[re:test(.,'^=.+=$', 'i')]");

Исключение составляет:

Необходимо использовать диспетчер имен или XsltContext. Этот запрос имеет префикс, переменную или пользовательскую функцию.

Изменить: Html генерируется FCKEditor и не имеет определенного пространства имен. Нужно ли мне что-то устанавливать для этого?

HTML:

<p><style type="text/css">
h2 a { color: black; }</style></p>
<p>----</p>
<h2>test <a href="http://searisen.com">link</a></h2>
<p>== Heading 2 ==</p>
<p>----</p>
<p>=== Heading [http://searisen.com SeaRisen.com] ===</p>

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

Ошибка, возникшая из-за того, что выражение re:test использует функцию XPATH с именем test (объявляется в пространстве имен с префиксом re ), что неизвестно контексту XSLT.

Я не знаю, откуда у вас это выражение, но он не является стандартным, поэтому в контексте Html Agility Pack ничего не значит :-)

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

Тем не менее, здесь «чистый» Html Agility Pack / XPATH:

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p[text()='=.+=']");

Он использует фильтр (между [и]) и стандартный текст функции XPATH (), что означает «внутренний текст».


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

По-видимому, HtmlAgilityPack не обрабатывает пространства имен (не то, что у меня был). Так что я придумал этот хак,

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p")
    .Where(node => Regex.Match(node.InnerText, "^=.+=$").Success);

Если есть решение HtmlAgilityPack, я бы хотел его услышать!



Related

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