Я не нашел явного способа выбрать все узлы, которые существуют между двумя якорями (пара тегов <a></a>
) в файле HTML.
Первый якорь имеет следующий формат:
<a href="file://START..."></a>
Второй якорь:
<a href="file://END..."></a>
Я проверил, что оба могут быть выбраны с помощью начальных с (примечаниечто я использую HTML Agility Pack):
HtmlNode n0 = html.DocumentNode.SelectSingleNode("//a[starts-with(@href,'file://START')]"));
HtmlNode n1 = html.DocumentNode.SelectSingleNode("//a[starts-with(@href,'file://END')]"));
Учитывая это и мои любительские навыки XPath, я написал следующее выражение, чтобы получить все теги между двумя якорями:
html.DocumentNode.SelectNodes("//*[not(following-sibling::a[starts-with(@href,'file://START0')]) and not (preceding-sibling::a[starts-with(@href,'file://END0')])]");
Это, кажется, работает, но выбирает все документы HTML!
Мне нужно, например, для следующего фрагмента HTML:
<html>
...
<a href="file://START0"></a>
<p>First nodes</p>
<p>First nodes
<span>X</span>
</p>
<p>First nodes</p>
<a href="file://END0"></a>
...
</html>
удалить оба якоря, три P (включая, конечно, внутренний SPAN).
Любойспособ сделать это?
Я не знаю, предлагает ли XPath 2.0 более эффективные способы достижения этой цели.
* РЕДАКТИРОВАТЬ (особый случай!) *
Я должен такжеобработать случай, когда:
"Выберите теги между X и X ', где X это <p><a href="file://..."></a></p>
"
Так что вместо:
<a href="file://START..."></a>
<!-- xhtml to be extracted -->
<a href="file://END..."></a>
Я должен также обрабатывать:
<p>
<a href="file://START..."></a>
</p>
<!-- xhtml to be extracted -->
<p>
<a href="file://END..."></a>
</p>
Большое спасибо, еще раз.