re:test()XPath到HtmlAgilityPack(获取匹配的regex内部的所有p标签)

时间:2011-05-19 23:43:00

标签: c# html xpath html-agility-pack

我想要所有<p>=.+=</p>个标签。正则表达式独立工作,没有<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>

3 个答案:

答案 0 :(得分:4)

显然HtmlAgilityPack不处理命名空间(不是我有一个)。所以我想出了这个黑客,

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

如果有HtmlAgilityPack解决方案,我很乐意听到它!

答案 1 :(得分:1)

您遇到的错误是由于表达式re:test使用名为test的XPATH函数(在前缀为re的名称空间中声明),该函数未知XSLT上下文。

我不知道你从哪里得到那个表达式,但它不是标准的,所以它在Html Agility Pack上下文中没有任何意义: - )

如需深入解释,请参阅此处的精彩文章:Adding Custom Functions to XPath。请注意,可以使用这些技术使其工作。

那就是说,这里是一个“纯粹的”Html Agility Pack / XPATH实现:

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

它使用过滤器(在[和]之间)和标准XPATH函数text(),这意味着“内部文本”。

答案 2 :(得分:0)

回应Simon Mourier所说的,re:test()函数不是核心XPath函数。它在Calibre的XPath函数集(http://manual.calibre-ebook.com/xpath.html#term-re-test)中可用,但这是非标准扩展。除了Calibre之外,我不知道任何其他可能暴露re:test()函数的系统。

有关核心XPath函数和XSLT扩展函数的详细摘要,请参阅https://developer.mozilla.org/en-US/docs/Web/XPath/Functions