Поиск узла по значению, содержащему пробелы с использованием 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); 
Interesting Posts

Подключение к общей папке Vista из Windows 7

Swift – эквивалент IBOutletCollection

Код ошибки: 2013. Потерянное соединение с сервером MySQL во время запроса

Перечисления Java, enums JPA и Postgres – Как мне заставить их работать вместе?

Field.get (obj) возвращает все значения NULL для инъецированных управляемых бинов CDI, тогда как ручные вызовы getters возвращают правильные значения

Как выполнить функцию controllerа AngularJS при загрузке страницы?

Как защитить свое программное обеспечение от незаконного распространения?

Как сопоставить объекты XML с C #

Добавление самоподписанного сертификата в симулятор iphone?

Разница между типами string и char в C ++

Как отлаживать один stream в Visual Studio?

Почему Java Calendar установлен (int year, int month, int date), не возвращает правильную дату?

std :: map, как сортировать по значению, затем по ключу

Что означает A a ()?

Microsoft Word. Когда я нажимаю вкладку, она больше не отбрасывает маркер в списке

Давайте будем гением компьютера.