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

4

2 回答 2

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

另见:

希望有帮助。

于 2014-03-24T01:47:41.910 回答
1

实际上,当有命名空间声明时它会成功。它返回一个空集,这就是规范所说的返回,因此算作成功。

您对成功的定义似乎与规范中的不同。您没有这么说,但我们可以猜测您期望返回“项目”元素,即使它们与您正在搜索的名称空间不同。

我不会更进一步;@alecxe 已经给了你答案,如果你搜索“XPath 默认命名空间”,你会发现同样的问题被回答了一千次。但是,在未来,请不要假设我们隐含地知道您期望您的错误代码会做什么:告诉我们想要的结果;不要假设我们知道您所说的“失败”是什么意思:告诉我们实际发生的情况。

于 2014-03-24T08:31:17.160 回答