使用xpath shell解析xml
首先,我对shell,Java,Python,Perl以及任何其他基于Linux的脚本语言都非常陌生。我需要做一些我认为看起来相对简单的事情,但无法实现。我已经使用了awk和xpath(比如awk输出更好,但看起来并不容易)。
首先,我会告诉你的.xml输出我需要解析:使用xpath shell解析xml
Blockquote
<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.
在此先感谢!
您可能想要查看名为'xmlstarlet'的免费应用程序。谷歌为它。它非常强大,虽然语法可能有点难以掌握。除了它可以做的许多事情之外,它还能够将字段从XML树中拉出来,并将它们打印在一行中,以便您可以在标准的linux shellcript中对它们进行sed/awk/grep。
一个例子:
xmlstarlet sel -t -m /CLIOutput/data/Row -n -v "concat(Name,',',Type,',',Accessible,',',Hosts)"
这将使你CSV转换你的XML输出。 在那个阶段,你可以使用使用管道和“egrep的”以找到名称以P开始的任何行:
grep -E '^P'
希望有所帮助。
这是我在尝试运行命令时收到的错误.XPath错误:无效表达式 concat(名称,',',类型',',可访问',',主机) ^ 编译错误:元素值 - xsl:value-of:无法编译选择表达式'concat(Name,',',Type',','',''',Hosts)' – user1596205 2012-08-14 14:13:55
再次使用.xml – user1596205 2012-08-14 14:56:28
我不得不清理输入张贴一下。将更改为,然后:'cat intput.xml | xmlstarlet sel -t -m/CLIOutput/Data/Row -n -v“concat(Name,',',Type,',',Accessible,',',Hosts)”'给出:PROD3_A2_LUN10,VMFS,是,esx01s112等等。 – 2012-08-16 13:30:45
预期产量是多少? – Thor 2012-08-13 19:31:44
预期输出只是一个.xml或.csv文件,然后我可以运行CLI命令。我知道我仍然需要在looping和whileread.do以及所有这些方面进行工作,但是我似乎甚至无法通过导出恶意信息导出lol。 – user1596205 2012-08-13 19:33:57