2014-02-01 2 views
1

Я использую HTML ловкость пакет для разбора некоторых HTML, из которых фрагмент имеет вида:Получение узла в том же положении, в следующем собрате

<tbody> 
<tr> 
    <td><a href="remotelink1"><img /></a></td><td></td> 
    <td><a href="site2"><img /></a></td><td></td> 
    <td><a href="link3"><img /></a></td><td></td> 
    <td><a href="site4"><img /></a></td><td></td> 
    <td><a href="link5"><img /></a></td> 
</tr> 
<tr> 
    <td style="text-align: left;" width="200" height="45">a<br>b<br>c</td><td width="17"></td> 
    <td style="text-align: left;" width="200">d<br>e<br>f</td><td width="57"></td> 
    <td style="text-align: left;" width="200">g<br>h<br>i</td><td width="57"></td> 
    <td width="200">j<br>k<br>l</td><td width="57"></td> 
    <td width="200">m<br>n<br>o</td> 
</tr> 
<tr> 
    <td><a href="link6"><img /></a></td><td></td> 
    <td><a href="site7"><img /></a></td><td></td> 
    <td><a href="remotelink8"><img /></a></td><td></td> 
    <td><a href="site9"><img /></a></td><td></td> 
    <td><a href="link10"><img /></a></td> 
</tr> 
<tr> 
    <td style="text-align: left;" width="200" height="45">p<br>q<br>r</td><td width="17"></td> 
    <td style="text-align: left;" width="200">s<br>t<br>u</td><td width="57"></td> 
    <td style="text-align: left;" width="200">v<br>w<br>x</td><td width="57"></td> 
    <td width="200">y<br>z<br>aa</td><td width="57"></td> 
    <td width="200">ab<br>ac<br>ad</td> 
</tr> 

Задачи Я облицовка ассоциируя каждую ячейку со строкой «ниже» (т.е. в той же позиции в следующем родстве от родительского узла). т.е. я хочу связать ссылку «remotelink1» с узлами a<br>b<br>c и «site2» с d<br>e<br>f и т.д.

я могу получить только клетки, не содержащие Привязок никаких проблем с:

foreach (var item in doc.DocumentNode.SelectNodes("//div[@class='entry-content']/table/tbody/tr/td[a[@href]]")) 

Но я изо всех сил чтобы получить ячейку внизу, ближе я могу получить это:

var detail = item.SelectSingleNode("../following-sibling::tr/td[position()]"); 

Но что получает положение узла итерируемым, а не item узла в его родителе. Можно ли использовать выражение XPath для передачи позиции исходного узла в предикат, чтобы найти ячейку под ней?

ответ

2

я придумал эти уродливые предложения:

//tr[td[a[@href="remotelink1"]]] 
/following-sibling::tr[1] 
    /td[ position() = count(//tr/td[a[@href="remotelink1"]] 
           /preceding-sibling::td) + 1] 

и

//tr[td[a[@href="site2"]]] 
/following-sibling::tr[1] 
    /td[ position() = count(//tr/td[a[@href="site2"]] 
           /preceding-sibling::td) + 1] 
  • ориентируется в tr с td, содержащой ссылкой вы хотите,
  • выбирающего его следующих двойников tr элементы,
  • ограничения на первый следующий собрата
  • ищет ребенок td элемента
  • и фильтр на тех, которые позиция равно число предшествующих двойников td сек на td с ссылкой, которую вы хотите, +1, так как XPath позиция начинаются с 0

Я не знаю, если HTML маневренности пакет поддерживает XPath переменные, но вы можете просто изменить переменную «remotelink1», а затем «site2» и использовать переменную в коварный план 2 [@href=...]

+0

, я адаптировал принцип: 'var detail = item.Sele ctSingleNode (string.Format ("../../ next-sibling :: tr/td [position() = (count (../ previous-sibling :: tr/td [a [@href = '{0} ']]/previous-sibling :: td) + 1)] ", item.Attributes [" href "]. Значение));' –

+0

Wicked! О, это весело –

Смежные вопросы