将HtmlNode转换为Xpath

时间:2016-05-23 03:46:49

标签: c# html xpath

我使用C#和HtmlAgilityPack。如果我有任何html节点字符串,例如:

标记name1 =“value1”name2 =“value2; value3”......

我想将其转换为xpath字符串: // tag [@ name1 ='value1'和@ name2 ='value2; value3'和...]

当我不知道标签是什么('id'或'class'或'td'...); 名称('href'或'src'或'style'...);的

我是否需要拆分字符串以获取“标记”,“ name1 ”,“ value1 ”,“的值name2 ',' value2;值3 '由我自己或使用其他更短的方式?

你可以通过转换为LinQ来帮助我,但我认为LinQ比Xpath更难。

1 个答案:

答案 0 :(得分: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']