通过使用XPath将它们与彼此相邻分组来选择表行

时间:2014-08-18 22:17:02

标签: c# xpath

我不清楚如何在问题中正确表达我的问题,如果我无法正确传达我的问题,请原谅我。我有以下数据。

<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行,依此类推。

2 个答案:

答案 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));
}