Поиск узла по значению, содержащему пробелы с использованием XPath

Мне нужно найти узел в XML-файле по его значению с помощью XPath. Проблема возникает, когда найденный узел содержит значение с пробелами внутри. Fe:

 value value with spaces  

Я не могу построить XPath, определяя второй дочерний узел.

Простой XPath / Root / Child отлично работает для обоих детей, но / Root [Child = value with spaces] возвращает пустую коллекцию.

Я уже пробовал маскировать пробелы с % 20 , & # 20; , & nbsp; и используя кавычки и двойные кавычки.

Еще не повезло.

У кого-нибудь есть идея?

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

Во-первых, напомним, что любой из этих символов является «пробелом»:

– вкладка

— новая линия

— возврат каретки

' ' или — космос

Если вы знаете точное значение узла, скажем, что это « Hello World » с пробелом, то самое прямое выражение XPath:

/top/aChild[. = 'Hello World']

выберет этот узел.

Однако трудности с указанием значения, содержащего пробелы, исходят из того факта, что мы видим все пробельные символы так же … ну, пробелы и не знаем, является ли это группой пробелов или одной вкладкой.

В XPath 2.0 можно использовать регулярные выражения, и они обеспечивают простое и удобное решение . Таким образом, мы можем использовать выражение XPath 2.0, как показано ниже:

/*/aChild[matches(., "Hello\sWorld")]

для выбора любого дочернего элемента верхнего узла, значением которого является строка «Hello», за которым следует пробел, за которым следует строка «Мир». Обратите внимание на использование функции matches() и шаблона « \s », который соответствует пробелу.

В XPath 1.0 удобный тест, если заданная строка содержит любые пробельные символы:

not(string-length(.)= stringlength(translate(., ' ','')))

Здесь мы используем функцию translate() для устранения любого из четырех пробельных символов и сравниваем длину результирующей строки с длиной исходной строки.

Итак, если в текстовом редакторе значение узла отображается как

“Привет мир”,

мы можем безопасно выбрать этот узел с выражением XPath:

/*/aChild[translate(., ' ','') = 'HelloWorld']

Во многих случаях мы также можем использовать функцию XPath normalize-space() , которая из своего строкового аргумента создает другую строку, в которой разрезаются группы начального и конечного пробелов, а каждое пробелы внутри строки заменяется одним пробелом.

В приведенном выше случае мы просто используем следующее выражение XPath:

/*/aChild[normalize-space() = 'Hello World']

Попробуйте либо следующее:

 /Root/Child[normalize-space(text())=value without spaces] 

или

 /Root/Child[contains(text(),value without spaces)] 

или (поскольку это похоже на то, что значение теста может быть проблемой)

 /Root/Child[normalize-space(text())=normalize-space(value with spaces)] 

На самом деле они не выполнялись ни одним из них, поэтому синтаксис может быть неустойчивым.

Поиск атрибута по значению, содержащему пробелы с использованием XPath

У меня есть элемент типа ввода со значением, содержащим пробел.

например:

  

Я решил это, используя это выражение xpath.

 //input[contains(@value,'Import') and contains(@value ,'Selected')and contains(@value ,'File')] 

Надеюсь, это поможет вам, ребята.

вы попробовали # x20?

я искал это, как на второй ссылке :

попробуйте заменить пространство с помощью « x0020 »

это, похоже, работает для парня.

« x0020 » работал для меня на репозитории CQ5 / AEM, основанного на jackrabbit, в котором имена свойств имели пробелы. Ниже будет работать свойство «Record ID» –

 [(jcr:contains(jcr:content/@Record_x0020_ID, 'test'))] 

Все вышеперечисленные решения на самом деле не работали для меня. Однако есть гораздо более простое решение.

Когда вы создаете XMLDocument, убедитесь, что для свойства PreserveWhiteSpace установлено значение true;

  XmlDocument xmldoc = new XmlDocument(); xmldoc.PreserveWhitespace = true; xmldoc.Load(xmlCollection); 
Давайте будем гением компьютера.