как добраться, нормализовать-пространство () xpath функционируют для работы?

Просто нет никакой консоли, слушающей по умолчанию. При выполнении в режиме отладки существует присоединенная консоль, но в продуктивной среде это - как Вы подозревали, сообщение просто не идет никуда, потому что ничто не слушает.

8
задан Karim 1 December 2009 в 22:26
поделиться

2 ответа

Теперь, когда вы отредактировали вопрос, он имеет смысл. Давайте рассмотрим этот ввод:

<tr><td>x</td><td>User Name</td></tr>

и ваш нерабочий запрос:

//tr[normalize-space(td/text()) = 'User Name']

Теперь td / text () означает «выбрать все дочерние текстовые узлы всех дочерних узлов td из текущий узел ". В этом случае это даст набор узлов, состоящий из двух текстовых узлов, x и Имя пользователя .

Теперь вы вызываете normalize-space () на этот набор узлов. Тип единственного аргумента normalize-space () - это строка? . Поскольку набор узлов не является строкой, преобразования вступают в силу в соответствии с разделом 3.2 рекомендации XPath 1.0:

Аргумент преобразуется в строку типа, как будто путем вызова функции string ().

Теперь давайте посмотрим на определение string () в разделе 4.2:

Набор узлов преобразуется в строку путем возврата строкового значения узла в наборе узлов, который является первым в порядке документа . Если набор узлов пуст, возвращается пустая строка.

В нашем примере первый узел «в порядке документа» - это текстовый узел x , поэтому он будет использоваться ; второй узел игнорируется. Таким образом, вы вызываете normalize-space ('x') . Естественно, это не будет сравниваться с именем пользователя. Чтобы выполнить эту работу, используйте:

//tr[td[normalize-space(text()) = 'User Name']]

Это можно записать как «выберите все tr узлы, у которых есть дочерние узлы td , первый дочерний text () узел которого имеет нормализованное строковое значение Имя пользователя "- это то, что вам нужно. Кроме того, вы можете упростить это до:

26
ответ дан 5 December 2019 в 06:09
поделиться

Здесь отлично работает:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(@"
    <table>
        <tr><td>User Name</td></tr>
        <tr><td> User   Name </td></tr>
        <tr><td>   User Name   </td></tr>
    </table>");

Console.WriteLine(
    xmlDoc.SelectNodes(
        "//tr[td[normalize-space(.) = 'User Name']]").Count); // shows "3"

Не могли бы вы обновить свой вопрос фактическим образцом XML?

1
ответ дан 5 December 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: