我不清楚如何在问题中正确表达我的问题,如果我无法正确传达我的问题,请原谅我。我有以下数据。
<tr class="header">Random Value 1</tr>
<tr class="item">1</tr>
<tr class="item">2</tr>
<tr class="item">3</tr>
<tr class="header">Random Value 2</tr>
<tr class="item">4</tr>
<tr class="item">5</tr>
<tr class="item">6</tr>
<tr class="header">Random Value 3</tr>
<tr class="item">7</tr>
<tr class="item">8</tr>
<tr class="item">9</tr>
我想要实现的是我想要选择带有类标题。我通过使用以下代码行实现了这一点,
HtmlNodeCollection headerNodes = doc.DocumentNode.SelectNodes("//tr[@class='header']");
现在我拥有集合中的所有标题行。现在我循环遍历所有标题节点,我想获得与各个标题行相邻的表行。
foreach (HtmlNode node in headerNodes)
{
HtmlNodeCollection itemNodes = ???
}
我的问题是我应该写在这里,以便标题行包含文字&#34;随机值1&#34;我得到项目行1,2和3.类似于标题行与文本&#34;随机值2&#34;我得到项目第4,5和6行,依此类推。
答案 0 :(得分:1)
我不确定HtmlNodeCollection是什么,但是如果你使用普通的XPath并执行SelectNodes(它会返回一个XmlNodeCollection),那么你找到的是你用node.NextSibling寻找的元素。 所以,你的循环看起来像:
foreach (XmlNode node in headerNodes)
{
string entry = node.NextSibling.InnerXml;
}
答案 1 :(得分:0)
经过大量搜索和玩不同选项后,我找到了解决问题的方法。诀窍是用类&#34; item&#34;选择行。通过检查前面的标题行。所以你可以在XPath表达式中看到我选择了一个带有类&#34; item&#34;的tr。我也在检查它的前面的tr应该有class&#34; header&#34;必须具有当前标头HtmlNode的innerText值。这样就可以了。
foreach (HtmlNode header in headerNodes)
{
string xPath = "following-sibling::tr[contains(@class, 'item') and preceding-sibling::tr[@class='header'][1]='{0}']";
HtmlNodeCollection itemRows = header.SelectNodes(String.Format(xPath, header.InnerText));
}