0

我需要pom.xml在目录树的许多中列出这两个元素中的文本。这些文件也可能包含其他地方的元素,我只是在寻找这两个的内容。

理想情况下,我正在寻找一种以格式输出的工具<file-name>:<line-no>:<path>:<text>,例如

parent/pom.xml:12:/project/groupId:com.acme.project
features/persist/pom.xml:14:/project/parent/groupId:com.acme.project
features/persist/pom.xml:32:/project/groupId:com.acme.project.persist

对于以下输入文件:

**parent/pom/xml**
<project>
 ...
  <groupId>
  com.acme.project <!--LINE 12 --> 
  </groupId>
...
</project>

**feature/persist/pom.xml**
<project>
  <parent>
    <groupId>
    com.acme.project <!--LINE 14 --> 
    </groupId>
  </parent>
  ...
  <groupId>
  com.acme.project
  </groupId>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>
        a.b.c.d <!-- this is not listed in output -->
        </groupId>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

请注意,其他路径如dependencyManagement/dependencies/dependency/groupId不包括在内。

在 SO 上搜索时,我遇到了xmllint --xpathxmlstarlet 但我对 xpath 的了解不够,无法自己解决。

4

2 回答 2

0

我最终使用了xml2的 cygwin 构建:

xml2 <  pom.xml | grep -e "/project/parent/groupId" -e "/project/groupId"
/project/parent/groupId=...
/project/groupId=....
于 2013-05-08T18:56:23.837 回答
0

试试这个不带行号的 XPath 2.0 兼容查询,它检查所有查询路径中是否有匹配的<groupID/>元素并打印它们的文档名称,构造一个(不一定是唯一的)路径并添加元素的内容。

(//project/parent | //project)/groupId/string-join(
  (
    base-uri(),
    string-join(('', .//ancestor-or-self::*/name()), '/'),
    data(.)
  ), ':')

例如,您可以使用BaseX 集合运行它(就像我为测试所做的那样),其中包含您要查询的所有 XML 文件。

  1. 运行此命令以创建集合: CREATE DB xmldocs /path/to/xml-files
  2. 使用上面的 XPath 查询数据库

有不同的方法可以运行查询,请查看Standalone Mode 手册

该查询还应该在其他与 XPath 2.0 兼容的引擎中运行,例如 saxon(它也将支持行号,请参阅我上面的评论)。

于 2013-04-21T13:20:32.697 回答