从unix命令行执行基本xml解析的最简单方法

jon*_*rry 10 xml unix perl awk grep

我正在搜索具有某些属性的xml文件.例如,包含以下模式的文件:

<param-value>
  <name>Hosts</name>
  <description>some description</description>
  <value></value>
</param-value>
Run Code Online (Sandbox Code Playgroud)

对于这样的文件,我想解析另一个标记的值,例如:

<param-value>
  <name>Roles</name>
  <description>some description</description>
  <value>asdf</value>
</param-value>
Run Code Online (Sandbox Code Playgroud)

并打印出文件名和"asdf".从命令行完成此操作的最简单方法是什么?

我想到的一种方法是使用带有-l选项的grep来过滤匹配的文件,然后使用xargs grep来提取Roles的值.但是,grep不适用于多行正则表达式.我看到另一个问题表明它可以用-Pzo选项完成,但是没有任何运气让它在我的情况下工作.有更简单的方法吗?

Mar*_*nor 13

以下linux命令使用XPath访问XML文件中的指定值

for xml in `find . -name "*.xml"`
do  
echo $xml `xmllint --xpath "/param-value/value/text()" $xml`| awk 'NF>1'
done
Run Code Online (Sandbox Code Playgroud)

匹配XML文件的示例输出:

./test1.xml asdf
./test4.xml 1234
Run Code Online (Sandbox Code Playgroud)


cho*_*oba 0

我通常使用 Perl 的XML::XSH2。您可以在其中交互地处理 XML 文件,或者编写脚本。该脚本类似于(未经测试):

for my $file in { glob "*.xml" } {
    open $file ;
    my $param_value = //param-value[name="Hosts"] ;
    if $param_value echo $file $value/value ;
}
Run Code Online (Sandbox Code Playgroud)