C # и Xpath - возвращайте результат с использованием Node-Set и строкового типа в одном запросе Xpath

В проекте я использую Xpath для очистки цены. В этом случае у меня может быть 2 варианта, как получить цену, указанную в следующем запросе:

var xpath = @"substring-after(//div[@class='price'],":")|//span[@class="oldPrice"]";

В коде С#:

            HtmlDocument htmlDocument = new HtmlDocument();
                htmlDocument.LoadHtml(html);
            XPathNavigator navigator = document.DocumentNode.CreateNavigator();
            var eval = navigator.Evaluate(xpath); // here i get error: Expression must evaluate to a node-set.
            var expression = navigator.Compile(xpath); // and also here i get error: Expression must evaluate to a node-set.

Я понимаю, что substring-after(//div[@class='price'],":") - это возвращаемый тип строки. и что //span[@class="oldPrice"] является возвращаемым типом Node-Set

У вас есть предложение, как мне поступить в этом случае?
а) Должен ли я разделить xpath и разрешить каждую часть, разделенную символом '|' ?
б) Или есть другой способ получить результат, используя комбинированный запрос xpath выше, без разделения строки и проверки каждой части?
c) Пропустил ли я какой-либо другой класс, который делает то, что я ищу?

Надеюсь контекста достаточно.


person user3649898    schedule 26.02.2021    source источник


Ответы (1)


Оператор объединения работает только с наборами узлов, поэтому ваше выражение должно завершиться ошибкой, поскольку LHS является строкой (это строка, даже если //div ничего не выбирает).

Вы ожидаете, что //span[@class="oldPrice"] вернет один узел? В этом случае вы можете преобразовать его в строку с помощью функции string(), а затем соединить две строки с помощью функции concat().

Рассмотрите возможность перехода на более позднюю версию XPath, которая позволяет возвращать последовательности строк.

person Michael Kay    schedule 26.02.2021