Это потому, что ваш XML-документ использует пространство имен.XPath действительно раздражает пространства имен.Чтобы убедиться в этом, удалите два xmlns=http://.../v1
из документа и снова запустите выражение XPath, в котором не размеченный, непроверяемый XML-файл.Это будет соответствовать.
То, что происходит, заключается в том, что ваше выражение XPath пытается выбрать /xyzevent
, когда ваш документ содержит {http://.../v1}:xyzevent
, что не одно и то же.
Существуют различные способывокруг этой проблемы.Надлежащим способом является установка NamespaceContext
, чтобы вы могли использовать нотацию prefix:localName
в выражении XPath и разрешить префиксы в правильном URI.В xerces docs и некоторых других в других местах StackOverflow есть небольшая реклама.Подробное описание на ibm.com .
. В вашем NamespaceContext
будет содержаться два (или более) сопоставления:
{
event => http://www.xyz.com/common/xyzevent/v1
source => http://www.xyz.com/common/xyzevent/source/v1
}
Тогда ваше выражение XPath может стать /event:xyzevent/source:subscription/source:receiver/.../text()
.
В качестве обходного решения , неприятного , вы можете переписать выражение xpath для выбора с помощью функции local-name()
:
/*[local-name()='xyzevent']/*[local-name()='subscription'/ ...
В этом случае выражениесоответствует любому элементу, локальное имя которого xyzevent
, независимо от URI пространства имен.