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