C# HtmlAgilityPack - 提取外部范围匹配值 <table><table></table></table>
C# HtmlAgilityPack - extract outer scope matched value <table><table></table></table>
string input = @"<table>
<tr>
<td>Text A</td>
</tr>
<tr>
<td>
<table> <!-- Notice this is an inner scope table -->
<tr>
<td>Text B</td>
</tr>
</table>
</td>
</tr>
</table>
<table>
<tr>
<td>
<table> <!-- Notice this is an inner scope table -->
<tr>
<td>Text C</td>
</tr>
</table>
</td>
</tr>
</table>
<table>
<tr>
<td>Text D</td>
</tr>
</table>"
我有一系列上述字符串格式的表格。
我想提取出所有<tr>
中第一层的内容,其中期望提取的内容是:
Text A
<table>
<tr>
<td>Text B</td>
</tr>
</table>
<table>
<tr>
<td>Text C</td>
</tr>
</table>
Text D
使用 HtmlAgilityPack:
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(input);
var output = htmlDocument.DocumentNode
.SelectNodes("table/tr");
正在拾取内部表而不是外部表。我不知道如何 "ensure only parent tr
's are getting picked up".
以 /
开始 XPath 表达式以明确指定相对于文档根的匹配,例如"/table/tr"
。这样的表达式匹配预期的内容,但与 <td>
标签一起。要获得与问题表达式中所写完全相同的结果,应更新为 "/table/tr/td"
:
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(input);
var output = htmlDocument.DocumentNode
.SelectNodes("/table/tr/td");
foreach (HtmlNode node in output)
{
Console.WriteLine(node.InnerHtml);
}
string input = @"<table>
<tr>
<td>Text A</td>
</tr>
<tr>
<td>
<table> <!-- Notice this is an inner scope table -->
<tr>
<td>Text B</td>
</tr>
</table>
</td>
</tr>
</table>
<table>
<tr>
<td>
<table> <!-- Notice this is an inner scope table -->
<tr>
<td>Text C</td>
</tr>
</table>
</td>
</tr>
</table>
<table>
<tr>
<td>Text D</td>
</tr>
</table>"
我有一系列上述字符串格式的表格。
我想提取出所有<tr>
中第一层的内容,其中期望提取的内容是:
Text A
<table>
<tr>
<td>Text B</td>
</tr>
</table>
<table>
<tr>
<td>Text C</td>
</tr>
</table>
Text D
使用 HtmlAgilityPack:
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(input);
var output = htmlDocument.DocumentNode
.SelectNodes("table/tr");
正在拾取内部表而不是外部表。我不知道如何 "ensure only parent tr
's are getting picked up".
以 /
开始 XPath 表达式以明确指定相对于文档根的匹配,例如"/table/tr"
。这样的表达式匹配预期的内容,但与 <td>
标签一起。要获得与问题表达式中所写完全相同的结果,应更新为 "/table/tr/td"
:
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(input);
var output = htmlDocument.DocumentNode
.SelectNodes("/table/tr/td");
foreach (HtmlNode node in output)
{
Console.WriteLine(node.InnerHtml);
}