ОБНОВЛЕНИЕ # 1 : добавлена ссылка .NET Fiddle: https://dotnetfiddle.net/twN2nE ОБНОВЛЕНИЕ # 2 : подтвержденная ошибка с HtmlAgilityPack (см. Сообщаемую проблему): https://github.com/zzzprojects/html-agility-pack/issues/309 ОБНОВЛЕНИЕ # 3 : Изменен заголовок вопроса с
HtmlAgilityPack для получения позиции (т.е. индекса и длины) для всех узлов InnerText с использованием XPath
Кому:
HtmlAgilityPack рассматривает инструкции по обработке XML как текстовый узел.
Исходный вопрос / проблема :
Следующий метод возвращает индекс и длину для каждого текстового узла в (x) HTML-документе.Однако запрос XPath не исключает инструкции обработки XML.т.е. " <? foo ...?> "
Private Function GetTextNodePositions(p_documentNode As HtmlNode) As List(Of KeyValuePair(Of Integer, Integer))
Dim _nodeIndexes As New List(Of KeyValuePair(Of Integer, Integer))
Dim _documentNodes = p_documentNode.SelectNodes("//body//text()[(normalize-space(.) != '') and not(parent::script) and not(*)]")
If _documentNodes Is Nothing Then Return Nothing
For Each _node In _documentNodes
_nodeIndexes.Add(New KeyValuePair(Of Integer, Integer)(_node.InnerStartIndex, _node.InnerLength))
Next
Return _nodeIndexes
End Function
Это HTML-код, использованный для репликации ошибки:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=UTF-8"/>
<title>Test</title>
</head>
<body>
<p>This is a text</p>
<p><?foo n="28" folio="5" ?></p>
</body>
</html>
Снимок экрана:результат (коллекция пар KeyValue)
Я также пытался " not (self :: processing-инструкция ()) ".Я все еще получаю результат определения местоположения и длины для " <? Foo n =" 28 "folio =" 5 "?>
"
// body // text () [(normalize-space (.)! = ''), а не (parent :: script) и not (*) и not (self :: processing-инструкция ())]
Пожалуйста, помогите!