xmllint:非root xml元素上的xmlns?

use*_*301 6 xml xpath maven xmllint

xmllint --xpath "//project" test.xml
Run Code Online (Sandbox Code Playgroud)

失败了

<?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>
Run Code Online (Sandbox Code Playgroud)

但如果我删除xmlns属性,请成功:

<?xml version="1.0" encoding="UTF-8"?>

<projects>
  <project>
    <modelVersion>4.0.0</modelVersion>
  </project>
</projects>
Run Code Online (Sandbox Code Playgroud)

这有什么问题吗?xmlns在非顶级标签上是否合法?

我正在使用Java Maven:

mvn help:effective-pom
Run Code Online (Sandbox Code Playgroud)

并在非顶部元素上生成带有xmlns的xml,如图所示.

ale*_*cxe 11

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

xmllint --xpath "//*[local-name()='project']" test.xml
Run Code Online (Sandbox Code Playgroud)

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

echo -e 'setns ns=http://maven.apache.org/POM/4.0.0\ncat //ns:project' | xmllint --shell test.xml
Run Code Online (Sandbox Code Playgroud)

另见:

希望有所帮助.

  • 只是一个小纸条:为了从一个Maven pom.xml的版本,试试:`xmllint --xpath"/*[本地名称()= "项目"]/*[本地名称()= "版本"]/text()'pom.xml` < - 提供了多个/链式`local-name()`的示例 (2认同)