2016-05-23 53 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