2016-08-24 26 views
0

我需要一個x路徑,只選擇所有節點的子字符串。我已經使用這個x路徑,但選擇所有的文本,而不是子字符串。對於只選擇所有節點的子字符串的html的XPath函數'substring-after'的正確語法?

//span[@class="feed-date"]/text()[substring-after(., "on ")] 

的Html我:我願意只提取日期後 '出版'

<span class="feed-date">Published on 2016-07-07</span> 
<span class="feed-date">Published on 2015-02-23</span> 
<span class="feed-date">Published on 2014-11-13</span> 
<span class="feed-date">Published on 2014-04-28</span> 

I found this link that say you can do it in xml

但我不能用HTML做。有什麼辦法可以做到這一點?

回答

2

分別在XPath 2.0及更高版本中XQuery 1.0及更高版本或XSLT 2.0及更高版本可以使用//span[@class = 'feed-date']/substring-after(., 'on ')來獲取字符串值序列。如果XPath 1.0的功能不存在,則需要以主機語言迭代所有span元素,併爲每個範圍提取字符串。

至於使用XPath 2.0 HTMLAgilityPack,看上去好像這是可能利用的https://github.com/StefH/XPath2.Net這也可在的NuGet,這樣微軟XPathNavigator變得像XPath2Evaluate各種擴展方法,然後讓你使用XPath 2.0功能這兩個文件都是由微軟的XPathDocument創建的XPathNavigator以及HTMLAgilityPack的HtmlDocument

下面是一個例子:

using System; 
using System.Xml.XPath; 
using Wmhelp.XPath2; 
using HtmlAgilityPack; 

namespace XPath20Net1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      XPathNavigator nav = new XPathDocument("XMLFile1.xml").CreateNavigator(); 
      Console.WriteLine(nav.XPath2Evaluate("string-join(//span[@class = 'feed-date']/substring-after(., 'on '), ' ')")); 

      HtmlDocument doc = new HtmlDocument(); 
      doc.Load("HTMLPage1.html"); 

      Console.WriteLine(doc.CreateNavigator().XPath2Evaluate("string-join(//span[@class = 'feed-date']/substring-after(., 'on '), ' ')")); 
     } 
    } 
} 

隨着XML文檔是

<?xml version="1.0" encoding="utf-8" ?> 
<html> 
    <body> 
    <span class="feed-date">Published on 2016-07-07</span> 
    <span class="feed-date">Published on 2015-02-23</span> 
    <span class="feed-date">Published on 2014-11-13</span> 
    <span class="feed-date">Published on 2014-04-28</span> 
    </body> 
</html> 

和HTML文檔是

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title>Test</title> 
</head> 
<body> 
<p id=test> 

     <span class="feed-date">Published on 2016-07-07</span> 
     <span class="feed-date">Published on 2015-02-23</span> 
     <span class="feed-date">Published on 2014-11-13</span> 
     <span class="feed-date">Published on 2014-04-28</span> 

</body> 
</html> 

然後輸出是

2016-07-07 2015-02-23 2014-11-13 2014-04-28 
2016-07-07 2015-02-23 2014-11-13 2014-04-28 
+0

我使用螢火蟲在瀏覽器中選擇。編碼中的HtmlAglityPack都不會使用Xpath 2.0? –

+1

瀏覽器尚未嘗試支持XPath 2.0。而HTMLAgilityPack則利用了也只實現了XPath 1.0的Microsoft .NET XPathNavigator基礎結構。因此,在這種情況下,您需要先選擇所有'// span [@class ='feed-date']'元素,然後在每個選定的跨度上使用'substring-after(。''on')'。 –

+1

@NithinB,我已經編輯了我的答案,以顯示如何使用NuGet提供的XPath 2.0庫與HTMLAgilityPack一起使用單個XPath表達式'string-join(// span [@class ='feed-date']/substring-after(。,'on'),'')'選擇一個包含所有日期值的字符串。 –

相關問題