xmllint:xmlns在非根xml元素上?

xmllint:xmlns在非根xml元素上?,xml,maven,xpath,xmllint,Xml,Maven,Xpath,Xmllint,失败 xmllint --xpath "//project" test.xml 这将在非顶部元素上生成xml,如图所示。最简单的解决方法是检查local-name(): 或者,定义名称空间并使用它: xmllint --xpath "//*[local-name()='project']" test.xml 另见: 希望这会有所帮助。当有名称空间声明时,它实际上会成功。它返回一个空集,这是规范所说的它返回的,因此这被视为成功 您对成功的定义似乎与规范中的定义不同。您没有这样说,但我

失败

xmllint --xpath "//project" test.xml

这将在非顶部元素上生成xml,如图所示。

最简单的解决方法是检查
local-name()

或者,定义名称空间并使用它:

xmllint --xpath "//*[local-name()='project']" test.xml
另见:


希望这会有所帮助。

当有名称空间声明时,它实际上会成功。它返回一个空集,这是规范所说的它返回的,因此这被视为成功

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


我不会再往前走了@alecxe已经给出了答案,如果搜索“XPath默认名称空间”,您会发现相同的问题被回答了一千次。不过,在将来,请不要假设我们知道您希望错误代码做什么:告诉我们想要的结果;不要以为我们知道“失败”是什么意思:告诉我们实际发生了什么。

您需要通过xmllint shell声明名称空间。请参见此处:只是一个小提示:要从Maven pom.xml提取版本,请尝试:
xmllint--xpath'/*[local-name()=“project”]/*[local-name()=“version”]/text()”pom.xml
<?xml version="1.0" encoding="UTF-8"?>

<projects>
  <project>
    <modelVersion>4.0.0</modelVersion>
  </project>
</projects>
mvn help:effective-pom
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