2016-08-09 14 views
0

Ich versuche, eine Funktion in einem XPath-Ausdruck zu verwenden:XPath SelectSingleNode mit Funktionsnutzung

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

Der C# -Code, die den Ausdruck wie folgt aussieht verarbeitet:

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

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

Aber dies führt zu eine Ausnahme: "Der Ausdruck muss zu einem Knoten führen"

Es klingt für mich wie die Ausgabe von substring-before kann nicht in eine HtmlNode "übersetzt" werden Art. Was natürlich logisch ist. Also meine Frage ist, wie man einen XPath-Ausdruck verarbeitet, der Funktionen verwenden kann?

+0

Beantwortet Ihre Frage nicht direkt, aber ... haben Sie CsQuery ausprobiert? https://github.com/jamietre/CsQuery Ich fand HtmlAgilityPack viel schwieriger zu verwenden als dies. In Bezug auf Ihre Frage wäre es hilfreich, wenn Sie eine XML-Beispieldatei bereitstellen, mit der Sie diesen Code ausführen. – Neolisk

+0

Sie suchen also nach einem Datentyp, der das Ergebnis einer beliebigen xpath Ausdruck Auswertung enthalten kann, ist das richtig? (Das heißt, Sie wissen nicht, ob Sie einen Skalar, einen Knoten oder einen Knotensatz zurückbekommen) – AakashM

+0

Leider kann ich das inspizierte Dokument nicht hinzufügen. Da es eine Webseite ist und nicht meine. @AakashM Ja das ist irgendwie. Aber ich kann 'Object' nicht verwenden, da es eine Ausnahme auslöst, bevor etwas zurückgegeben wird. –

Antwort

1

Die HtmlDocument des HTML-Agility-Pack implementiert die XPathNavigator API (https://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathnavigator(v=vs.110).aspx), so können Sie einfach CreateNavigator() aufrufen und verwenden Sie dann die Evaluate Methode (https://msdn.microsoft.com/en-us/library/2c16b7x8(v=vs.110).aspx), zum Beispiel, wenn Sie Sie substring-before in XPath rufen wissen und auf diese Weise einen String bekommen Sie können z

 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); 

und der Ausgang ist test:.

+0

super danke! –