使用C# 4.0和HtmlAgilityPack,如何读取特定表格内的值?我的意思是说,假设有10个表格,我想从第6个表格中读取值,或者我有表格ID。
或者说我想读取某个td后面的td值。
或者在特定的div、元素或文本之后出现的表格。这些可行吗?
或者说我想读取某个td后面的td值。
或者在特定的div、元素或文本之后出现的表格。这些可行吗?
你所提到的所有问题都可以相对容易地解决。虽然它的文档可能缺乏,但在使用和功能上应该类似于XML和网络中的XmlDocument
实现。
如何读取特定表格内的值?比如说有10个表格,我想读取第6个表格的值或者我已经知道表格的ID。
找到第6个表格:
// XPath
var table6 = doc.DocumentNode.SelectSingleNode("//table[6]");
// LINQ
var table6 = doc.DocumentNode.Descendants("table").Skip(5).FirstOrDefault();
通过id查找表格/元素:
var myTable = doc.GetElementById("myTable");
// XPath
var myTable = doc.DocumentNode.SelectSingleNode("//table[@id='myTable']");
var myTable = doc.DocumentNode.SelectSingleNode("//*[@id='myTable']");
// LINQ
var myTable = doc.DocumentNode
.Descendants("table")
.Where(table => table.Attributes.Contains("id"))
.SingleOrDefault(table => table.Attributes["id"].Value == "myTable");
var myTable = doc.DocumentNode
.Descendants()
.Where(e => e.Attributes.Contains("id"))
.SingleOrDefault(e => e.Attributes["id"].Value == "myTable");
var myTable = doc.DocumentNode
.Descendants("table")
.SingleOrDefault(table => table.GetAttributeValue("id", null) == "myTable");
var myTable = doc.DocumentNode
.Descendants()
.SingleOrDefault(e => e.GetAttributeValue("id", null) == "myTable");
假设我想要读取某个特定 td 后面的 td 值。
// XPath
var certainTd = table6.SelectSingleNode("//td[2]");
var tdAfterCertainTd = certainTd.SelectSingleNode("following-sibling::td[1]");
// LINQ (not so easy)
var certainTd = table6.Descendants("td").Skip(1).FirstOrDefault();
var tdAfterCertainTd = certainTd.NextSibling;
while (tdAfterCertainTd != null)
{
if (tdAfterCertainTd.Name == "td")
break;
tdAfterCertainTd = tdAfterCertainTd.NextSibling;
}
如何在某个 div 元素或文本后面插入表格?
// XPath
var certainDiv = doc.DocumentNode.SelectSingleNode("//div[1]");
var tableAfterCertainDiv = certainDiv.SelectSingleNode("following-sibling::table[1]");
// LINQ (not so easy)
var certainDiv = doc.DocumentNode.Descendants("div").FirstOrDefault();
var tableAfterCertainDiv = certainDiv.NextSibling;
while (tableAfterCertainDiv != null)
{
if (tableAfterCertainDiv.Name == "table")
break;
tableAfterCertainDiv = tableAfterCertainDiv.NextSibling;
}
你应该注意到一些模式。