如何使用awk,Perl或Python挖掘XML文档?
我有一个
XML文件,其中包含以下数据格式:
<net NetName="abc" attr1="123" attr2="234" attr3="345".../> <net NetName="cde" attr1="456" attr2="567" attr3="678".../> .... 任何人都可以告诉我如何使用awk单行数据挖掘XML文件?例如,我想知道abc的attr3.它将返回345给我. 解决方法
一般来说,you don’t. XML / HTML解析很难,而不是简洁地完成它,虽然你可能能够将一个有限的XML子集成功解决方案,但最终它会破解.
此外,there are many great languages with great XML parsers already written,为什么不使用其中一个让你的生活更轻松? 我不知道是否有为awk构建的X??ML解析器,但我担心如果你想用awk解析XML你会得到很多“锤子用于钉子,螺丝刀用于螺钉”答案.我确信它可以完成,但是你可能更容易在Perl中快速编写一些使用XML :: Simple(我个人最喜欢的)或其他XML解析模块的东西. 为了完整起见,我想指出,如果您的代码段是整个文件的示例,那么它就不是有效的XML.有效的XML应该有开始和结束标记,如下所示: <netlist> <net NetName="abc" attr1="123" attr2="234" attr3="345".../> <net NetName="cde" attr1="456" attr2="567" attr3="678".../> .... </netlist> 我确定无效的XML有它的用途,但是一些XML解析器可能会抱怨它,所以除非你已经决定使用awk one-liner尝试半解析“解析”你的“XML”,你可能想要考虑使您的XML有效. 为了回应你的编辑,我仍然不会把它作为一个单行,但这里是你可以使用的Perl脚本: #!/usr/bin/perl use strict; use warnings; use XML::Simple; sub usage { die "Usage: $0 [NetName] ([attr])n"; } my $file = XMLin("file.xml",KeyAttr => { net => 'NetName' }); usage() if @ARGV == 0; exists $file->{net}{$ARGV[0]} or die "$ARGV[0] does not exist.n"; if(@ARGV == 2) { exists $file->{net}{$ARGV[0]}{$ARGV[1]} or die "NetName $ARGV[0] does not have attribute $ARGV[1].n"; print "$file->{net}{$ARGV[0]}{$ARGV[1]}.n"; } elsif(@ARGV == 1) { print "$ARGV[0]:n"; print " $_ = $file->{net}{$ARGV[0]}{$_}n" for keys %{ $file->{net}{$ARGV[0]} }; } else { usage(); } 使用1或2个参数从命令行运行此脚本.第一个参数是您要查找的’NetName’,第二个参数是您要查找的属性.如果没有给出属性,它应该只列出’NetName’的所有属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |