"<violation beginline="13" endline="13" begincolumn="19" endcolumn="36" rule="SystemPrintln" ruleset="Java Logging" package="com.test" class="Two" method="violation1Fix" externalInfoUrl="http://pmd.sourceforge.net/pmd-5.1.0/rules/java/logging-java.html#SystemPrintln" priority="2">System.out.print is used1</violation>
我上面有一个XML文件-

我想打印“violation”标签的值和每个标签的起始行号。如何使用grep或其他linux命令执行此操作?

我现在不想加载XML文件,然后再打印该值,因为它可能存在性能问题。

最佳答案

除非您确定文本格式是固定的,否则我不会使用正则表达式相关工具来执行此操作。任何单个换行符都可能破坏sed/grep解决方案。

您需要的是xpath来解析xml并提取内容。在Linux下,您可以尝试xmllint:

xmllint --xpath '//violation/text()' file.xml

将输出:
System.out.print is used1

更新,添加xpath以获得属性:
xmllint --xpath 'number(//violation/@beginline)' file.xml

输出:
13

如果要使用属性名称的值:
xmllint --xpath '//violation/@beginline' file.xml

输出:
beginline="13"

10-05 22:47