使用xpath shell解析xml

时间:2012-08-13 18:55:52

标签: parsing xpath awk

首先,我对shell,Java,Python,Perl和任何其他基于Linux的脚本语言都很陌生。我需要做一些我认为似乎相对简单的事情,但却无法让它发挥作用。我使用过awk和xpath(比较awk输出更好,但似乎不太容易使用) 首先,我将向您展示我需要解析的.xml输出:

  

块引用

<CLIOutput>
   <Data>
     <Row>
     <Name>PROD3_A2_LUN10</Name>
     <Type>VMFS</Type>
     <Accessible>Yes</Accessible>
     <Hosts>esx01s112</Hosts>
   </Row>
   <Row>
     <Name>PRIVATE_VDI_SDLC3_A2_LUN174</Name>
     <Type>VMFS</Type>
     <Accessible>Yes</Accessible>
     <Hosts>esx02s104</Hosts>
   </Row>
   <Row>
     <Name>datastore1</Name>
     <Type>VMFS</Type>
     <Accessible>Yes</Accessible>
     <Hosts>esx01s100</Hosts>
   </Row>
 </data>
</CLIOutput>

理想情况下,我希望不仅能够报告“名称,类型,可访问和主机”的XML属性,还能在其中报告仅发送我想要的输出,即想要报告所有“命名“以”P“开头。我的代码尝试日期是:

* awk '$1~"^(" s ")$"{print $2}' RS=\< FS=\> s="Name" sdlcproxy1diff.xml -- shows me all "Name" items.| 
* xpath datastore.xml '/CLIOutput/Data/Row/*[self::Name]/text()' datastore.xml 2>/dev/null -- shows all "Name" items, but output is horrible.  

提前致谢!!

1 个答案:

答案 0 :(得分:1)

您可能希望查看名为“xmlstarlet”的免费应用程序。谷歌吧。它非常强大,虽然语法可能有点难以掌握。除了它可以做的很多事情之外,它还能够从XML树中提取字段,并将它们打印在一行上,这样你就可以在标准的linux shellcript中sed / awk / grep它们。

一个例子:

xmlstarlet sel -t -m /CLIOutput/data/Row -n -v "concat(Name,',',Type,',',Accessible,',',Hosts)"

这将为您提供XML的CSV转换输出。 在那个阶段,您可以使用管道和'egrep'来查找名称以P:

开头的任何行
grep -E '^P'

希望有所帮助。