HtmlAgilityPack рассматривает инструкции по обработке XML как текстовый узел - PullRequest
0 голосов
/ 29 июня 2019

ОБНОВЛЕНИЕ # 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-инструкция ())]

Пожалуйста, помогите!

...