2016-05-23 49 views
-1

我使用C#和HtmlAgilityPack。如果我有一個任何HTML節點的字符串,例如:將HtmlNode轉換爲Xpath

標籤名1 =「值1」名稱2 =「值2,值3」 ...

我想將其轉換爲XPath字符串: //標記[@ name1 ='value1'和@ name2 ='value2; value3'和...]

當我不知道那些是什麼標記('id'或'class'或'td'...); 名稱('href'或'src'或'style'...);

我必須分割字符串得到的 '標籤' 價值 '名1', '值1', '名2',「值2;價值3'自己或使用其他更短的方式嗎?


您可以通過轉換爲LinQ來幫助我,但我認爲LinQ比Xpath更困難。

回答

0

您可以結合HtmlNode.Name和屬性 - 值對列表轉換XPath字符串如下:(如擴展方法來實現)

public static class Extensions 
{ 
    public static string ToXPath(this HtmlNode node) 
    { 
     var attributes = node.Attributes.Any() ? "[" + string.Join(" and ", node.Attributes.Select(o => "@" + o.Name + "='" + o.Value + "'")) + "]" : ""; 
     var xpath = "//" + node.Name + attributes; 
     return xpath; 
    } 
} 

實例:

var raw = @"<div> 
<span id='span_1' class='baz'>foo</span> 
<span id='span_2'>bar</span> 
</div>"; 
var doc = new HtmlDocument(); 
doc.LoadHtml(raw); 
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//*")) 
{ 
    Console.WriteLine(node.ToXPath()); 
} 

輸出:

//div 
//span[@id='span_1' and @class='baz'] 
//span[@id='span_2'] 
+0

非常感謝您快速回答,但您的代碼有錯誤。我想也許** node.Attributes.Select(o =>「@」+ o.Name +「='」+ o.Value +「'」)**需要**。ToArray()**。它的工作原理是:D – Viol