具有函数用法的XPath SelectSingleNode

时间:2016-08-09 13:12:52

标签: c# xpath

我试图在XPath表达式中使用函数:

substring-before(//span[@class='TextH3 LayoutSmallRow'], "PPAPI")

处理表达式的C#代码如下所示:

HtmlWeb Web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument HtmlDoc = new HtmlAgilityPack.HtmlDocument();
HtmlNode PageNode = null;

HtmlDoc = Web.Load(tbUpdateCheckURL.Text);
PageNode = HtmlDoc.DocumentNode.SelectSingleNode(tbUpdatePattern.Text);

但这会导致异常(从德语翻译):"表达式必须导致节点"

我觉得substring-before的输出无法被翻译成#34;到HtmlNode类型。这当然是合乎逻辑的。所以我的问题是如何处理可以使用函数的xpath表达式?

1 个答案:

答案 0 :(得分:1)

HTML Agility Pack的HtmlDocument实现XPathNavigator API(https://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathnavigator(v=vs.110).aspx),因此您只需调用CreateNavigator(),然后使用Evaluate方法( https://msdn.microsoft.com/en-us/library/2c16b7x8(v=vs.110).aspx),例如,如果您知道在XPath中调用substring-before,那么可以使用一个字符串,例如

        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml("<html><body><p>This is a <span>test: PPAPI.</span></p></body></html>");

        string result = (string)doc.CreateNavigator().Evaluate("substring-before(//span, 'PPAPI')");
        Console.WriteLine(result);

,输出为test: