xmllint --xpath "//project" test.xml
失败
<?xml version="1.0" encoding="UTF-8"?>
<projects>
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
</project>
</projects>
但如果我删除xmlns属性会成功:
<?xml version="1.0" encoding="UTF-8"?>
<projects>
<project>
<modelVersion>4.0.0</modelVersion>
</project>
</projects>
这有什么问题吗? xmlns在非顶级标签上是否合法?
我正在使用Java Maven:
mvn help:effective-pom
并在非顶部元素上生成带有xmlns的xml,如图所示。
答案 0 :(得分:11)
最简单的解决方法是检查local-name()
:
xmllint --xpath "//*[local-name()='project']" test.xml
或者,定义命名空间并使用它:
echo -e 'setns ns=http://maven.apache.org/POM/4.0.0\ncat //ns:project' | xmllint --shell test.xml
另见:
希望有所帮助。
答案 1 :(得分:2)
实际上,当存在名称空间声明时,它会成功。它返回一个空集,这是规范所说的返回值,因此算作成功。
您对成功的定义似乎与规范中的定义不同。你不能这么说,但我们可以猜测你正在期待&#34;项目&#34;要返回的元素,即使它们与您正在搜索的名称空间不同。
我不会走得更远; @alecxe已经给你答案了,如果你搜索&#34; XPath默认命名空间&#34;你会发现同样的问题答案一千次。但是,在将来,请不要假设我们隐含地知道您对错误代码的期望:告诉我们想要的结果;并且不要以为我们知道你的意思&#34;失败&#34;:告诉我们实际发生了什么。