我有以下XPath表达式:
/configuration/properties
这是我的XML:
<configuration
xmlns="http://www.ksharma.in/myXSD">
<properties>
<property key="a" value="1" />
<property key="b" value="2" />
</properties>
</configuration>
XPath不起作用。但是,如果我将名称空间从xmlns
更改为xmlns:conf
则可以:
<configuration
xmlns:conf="http://www.ksharma.in/myXSD">
<properties>
<property key="a" value="1" />
<property key="b" value="2" />
</properties>
</configuration>
为什么会这样?
答案 0 :(得分:9)
将xmlns="http://www.ksharma.in/myXSD"
放置在XML的根元素上会将根及其后代放在http://www.ksharma.in/myXSD
命名空间中。这实际上意味着XML文档中的所有元素名称都以http://www.ksharma.in/myXSD
开头。但是,XPath中声明的元素在http://www.ksharma.in/myXSD
命名空间中不是。因此,您的XPath 不匹配。
将xmlns:conf="http://www.ksharma.in/myXSD"
放置在根元素上只是为http://www.ksharma.in/myXSD
命名空间定义了一个前缀,但实际上并没有使用它。根元素及其后代保留在无命名空间中,因此您的XPath也可以找到它,也可以在没有命名空间的情况下进行测试。因此,您的XPath 匹配。
答案 1 :(得分:4)
这是因为您处于默认命名空间xmlns="http://www.ksharma.in/myXSD"
中。你可以尝试
/*[local-name()='configuration']/*[local-name()='properties']
代替。
答案 2 :(得分:3)
命名空间wihtout前缀是默认命名空间。具有默认名称空间,声明名称空间的XML元素,以及没有前缀且没有在同一名称空间中考虑不同的非前缀名称空间声明的后代。
上面的第二个XML具有带前缀的名称空间声明。在这种情况下,对于要在该prefixed-namespace中考虑的元素,必须使用相应的前缀明确声明它。
为了能够访问默认命名空间中的元素,您必须声明一个指向默认命名空间URI的前缀,并在XPath查询中使用该前缀(或者按照@ Joel的回答中的建议使用local-name()
忽略命名空间)。