Это потому, что используется пространство имен XML по умолчанию (см. Объявление xmlns="http://www.liberologico.com/dbsite/jolly-search"
).
Выражение XPath наподобие /SearchResponse
не будет ничего совпадать, так как на самом деле нет элемента с таким именем (пространство имен элемента всегда учитывается в его имени).
Если вы не скажете серверу рассматривать элементы конкретно в этом пространстве имен, он никогда их не найдет.
Вы можете обойти это, указав, что вы ищете элементы в любом пространстве имен (функция local-name()
извлекает простое имя элемента):
//*[local-name() = 'Treevalue']/*/text()
или сообщив серверу, что пространство имен задействовано, присвоив ему префикс (скажем, js
) и выполнив поиск в XPath для полностью определенных имен:
//js:Treevalue/*/text()
Первый способ прост, поскольку на стороне сервера не требуется никаких изменений кода. С другой стороны, для этого нужны длинные и уродливые выражения XPath. Второй метод требует реализации поддержки пространства имен на сервере, но выражения XPath будут хорошими и чистыми.
Третий метод заключается в удалении объявления пространства имен из XML перед его отправкой на сервер, но - в зависимости от ситуации - это может оказаться невозможным.