我使用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更难。
答案 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']