我试图在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表达式?
答案 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:
。