2016-05-23 19 views
-1

Ich benutze C# und HtmlAgilityPack. Wenn ich einen beliebigen HTML-Knoten string, Beispiel haben:Convert HtmlNode zu Xpath

Tag name1 = "value1" name2 = "Wert2; value3" ...

ich möchte es konvertieren, um XPath-string: // Tag [@ Name1 = 'Wert1' und @ Name2 = 'Wert2; Wert 3 'und ...]

wenn ich nicht weiß, was sind diese Tag (' ID 'oder' Klasse 'oder' Td '...); Namen ('href' oder 'src' oder 'style' ...); Werte.

Muss ich String aufgeteilt haben, um Wert von 'Tag', 'name1', 'Wert1', 'name2', 'Wert2; Value3 'von mir selbst oder andere kürzere Wege?

Sie können mir helfen, indem Sie zu LinQ konvertieren, aber ich denke, LinQ ist schwieriger als Xpath.

Antwort

0

Sie können HtmlNode.Name und Liste wie folgt Attribut-Wert-Paare in XPath-String kombinieren: (implementiert als Extension-Methode)

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; 
    } 
} 

Beispiel Nutzung:

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()); 
} 

Ausgang :

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

Vielen Dank für die schnelle Antwort, aber Ihr Code hat einen Fehler. Ich denke vielleicht ** node.Attributes.Select (o => "@" + o.Name + "= '" + o.Wert + "'") ** brauche **. ToArray() **. Und es funktioniert: D – Viol