当前位置:  开发笔记 > 编程语言 > 正文

如何使用awk,Perl或Python挖掘XML文档?

如何解决《如何使用awk,Perl或Python挖掘XML文档?》经验,为你挑选了3个好方法。

我有一个XML文件,其中包含以下数据格式:



....

任何人都可以告诉我如何使用awk单行数据挖掘XML文件?例如,我想知道abc的attr3.它将返回345给我.



1> Chris Lutz..:

一般来说,你没有.XML/HTML解析很难,而不是简单地完成它,虽然你可以将一个有限的XML子集成功解决方案,但最终它会破解.

此外,有许多优秀的语言已经编写了很好的XML解析器,那么为什么不使用其中一种语言让你的生活更轻松呢?

我不知道是否有为awk构建的X​​ML解析器,但我担心如果你想用awk解析XML你会得到很多"锤子用于钉子,螺丝刀用于螺钉"答案.我确信它可以完成,但是你可能更容易在Perl中快速编写一些使用XML :: Simple(我个人最喜欢的)或其他XML解析模块的东西.

为了完整起见,我想指出,如果您的代码段是整个文件的示例,那么它就不是有效的XML.有效的XML应该有开始和结束标记,如下所示:


  
  
  ....

我确定无效的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'.



2> mirod..:

我已经写了一个名为工具xml_grep2,基于XML ::的libxml,perl的接口的libxml2.

通过这样做你会找到你正在寻找的价值:

xml_grep2 -t '//net[@NetName="abc"]/@attr3' to_grep.xml

该工具可在http://xmltwig.com/tool/找到



3> 小智..:

xmlgawk可以非常轻松地使用XML.

$ xgawk -lxml 'XMLATTR["NetName"]=="abc"{print XMLATTR["attr3"]}' test.xml

这个衬里可以解析XML并打印"345".

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有