问题在于命名空间。所有元素都绑定到命名空间 urn:jboss:domain:1.7 。由于没有名称空间前缀,因此有点难以看到。所有元素都绑定到该命名空间,但除非名称空间前缀用于属性,否则它不会。
urn:jboss:domain:1.7
那么,你的XPath: /x:server/x:system-properties/x:property[@x:name='app.datasource.security.user-name'] 应该:
/x:server/x:system-properties/x:property[@x:name='app.datasource.security.user-name']
/x:server/x:system-properties/x:property[@name='app.datasource.security.user-name']
对于XPath: /server[namespace-uri()='urn:jboss:domain:1.7']/system-properties/property[@name='app.datasource.security.user-name'] 你需要在任何元素上一般匹配 * 然后使用谓词来限制 local-name() 并且还可以使用 namespace-uri() 作为标准:
/server[namespace-uri()='urn:jboss:domain:1.7']/system-properties/property[@name='app.datasource.security.user-name']
*
local-name()
namespace-uri()
/*[local-name() = 'server' and namespace-uri() = 'urn:jboss:domain:1.7']/*[local-name() = 'system-properties']/*[local-name() = 'property' and @name='app.datasource.security.user-name']
对于XPath /*[local-name()=server]/system-properties/property[@name='app.datasource.security.user-name'] ,你没有 server 在引号中。它试图比较 local-name() 一个子元素 server ,这是不存在的。同样,您需要使用谓词来匹配 local-name() 为后代:
/*[local-name()=server]/system-properties/property[@name='app.datasource.security.user-name']
server
/*[local-name()='server']/*[local-name() = 'system-properties']/*[local-name() = 'property' and @name='app.datasource.security.user-name']