xmllint:非root xml元素上的xmlns?

时间:2014-03-24 01:31:48

标签: xml maven xpath xmllint

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,如图所示。

2 个答案:

答案 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;:告诉我们实际发生了什么。