Это наиболее часто задаваемые вопросы по нескольким тегам, связанным с XPath .
Когда в документе XML есть пространство имен по умолчанию (как в вашем случае), любое имя элемента в выражении XPath должно начинаться с префикса, связанного с этим пространством имен по умолчанию. Привязка выполняется на языке хостинга XPath, как правило, путем «регистрации пространства имен по умолчанию» с использованием определенного метода / функции.
Причина, по которой это необходимо сделать :
Всякий раз, когда в выражении XPath есть имя без префикса, XPath обрабатывает это имя как принадлежащее «без пространства имен».
Вот нормативный текст спецификации XPath 1.0 W3C :
" QName в тесте узла раскрывается в расширенное имя с использованием объявлений пространства имен из контекста выражения. Аналогичным образом выполняется расширение для имен типов элементов в начальных и конечных тегах, за исключением того, что Пространство имен по умолчанию, объявленное с помощью xmlns, не используется: , если у QName нет префикса, тогда URI пространства имен имеет значение null (это то же самое, что и имена атрибутов, которые расширяются). префикс, для которого в контексте выражения нет объявления пространства имен".
Таким образом, оценка /a/b/c
в документе с пространством имен по умолчанию означает: выбрать все элементы, которые находятся в «без пространства имен» и имеют имя c
, чьим родителем является элемент с именем b
, который находится в «без пространства имен ", чьим родителем является верхний элемент документа xml, он называется a
и находится в" пространстве имен ".
Поскольку все элементы в документе находятся в пространстве имен по умолчанию, а не в «пространстве имен нет», это выражение XPath ничего не выбирает .
Решение
В API вашего движка XPath зарегистрируйте пространство имен по умолчанию и привяжите к нему префикс (скажем, «x»).
Теперь вы можете и должны использовать это выражение XPath: /x:myrequest/x:state/x:value
вместо /myrequest/state/value