XPathを使用してC#でいくつかのHTMLファイルをクエリするときに、小さな問題が発生しました。
さて、最初にサンプルHTMLを示します。
<table id="theTable">
<tbody>
<tr class="theClass">A</tr>
<tr class="theClass">B</tr>
<tr>1</tr>
<tr>2</tr>
<tr>3</tr>
<tr>4</tr>
<tr>5</tr>
<tr class="theClass">C</tr>
<tr class="theClass">D</tr>
<tr>6</tr>
<tr>7</tr>
<tr>8</tr>
<tr>9</tr>
<tr>10</tr>
<tr>11</tr>
<tr>12</tr>
<tr>13</tr>
<tr>14</tr>
<tr>15</tr>
<tr class="theClass">E</tr>
<tr class="theClass">F</tr>
<tr>16</tr>
<tr>17</tr>
<tr>18</tr>
<tr>19</tr>
<tr>20</tr>
<tr>21</tr>
<tr>22</tr>
</tbody>
</table>
今、私がやろうとしているのは、BノードとCノード(1、2、3、4、5)の間にある要素のみを取得することです。
これが私がこれまでに試したことです:
using System;
using System.Xml.XPath;
namespace Test
{
class Test
{
static void Main(string[] args)
{
XPathDocument doc = new XPathDocument("Test.xml");
XPathNavigator nav = doc.CreateNavigator();
Console.WriteLine(nav.Select("//table[@id='theTable']/tbody/tr[preceding-sibling::tr[@class='theClass'] and following-sibling::tr[@class='theClass']]").Count);
Console.WriteLine(nav.Select("//table[@id='theTable']/tbody/tr[preceding-sibling::tr[@class='theClass'][2] and following-sibling::tr[@class='theClass'][4]]").Count);
Console.ReadKey(true);
}
}
}
このコードは、上記のHTMLで実行され、19と5を出力します。したがって、2番目のXPath式のみが機能しますが、これは、class=theClass
前に2つの要素があり、後に4つの要素がある要素を検索するためです。
私の問題は今始まります。タグの後に続く要素の最初のグループのみを返す単一の式を作成したいと思います。これは、<td class="theClass"></td>
タグの後に続くグループの数に関係なく行われます。
このHTMLでコードを実行すると
<table id="theTable">
<tbody>
<tr class="theClass">A</tr>
<tr class="theClass">B</tr>
<tr>1</tr>
<tr>2</tr>
<tr>3</tr>
<tr>4</tr>
<tr>5</tr>
<tr>6</tr>
</tbody>
</table>
0と0を出力します。
だからそれは良くない。
誰かアイデアはありますか?
ありがとうございました!