在Perl中读取XML文件

阿伦·香卡(Arun shankar)

我有一个xml文件,如下所示。在perl中,我尝试使用hash键use XML::Simple; utility在哪里PluginsName,而Plugin详细信息的其余部分应为值。

所以,我想取以下值:PluginsNamePluginsStatusPluginspatchLogNamePluginsLogFileName并且PluginsLogFileErrors这是在标签PluginsLogFiles

基本上我想要给定的所有信息 PluginsName

<installer>
  <Plugins>
      <PluginsRunningSeq>1</PluginsRunningSeq>
      <PluginspatchLogName>abc_patch.log</PluginspatchLogName>
      <PluginsName>ConfigValue</PluginsName>
      <PluginsAttemptNo>1</PluginsAttemptNo>
      <PluginsStatus>Success</PluginsStatus>
      <PluginsStartTime>2015-05-10 20:02:46.651 +0000</PluginsStartTime>
      <PluginsEndTime>2015-05-10 20:03:14.002 +0000</PluginsEndTime>
      <PluginsDuration>0 min, 27 sec, 351 millis</PluginsDuration>
      <PluginsLogFiles>
        <PluginsLogFileName>abc.log</PluginsLogFileName>
        <PluginsLogFileLink>/tmp/abc.log</PluginsLogFileLink>
        <PluginsLogFileErrors>No Errors</PluginsLogFileErrors>
      </PluginsLogFiles>
      <PluginsErrors>No Errors</PluginsErrors>
    </Plugins>
    <Plugins>
      <PluginsRunningSeq>2</PluginsRunningSeq>
      <PluginspatchLogName>abc_patch_patch.log</PluginspatchLogName>
      <PluginsName>Patching Manager</PluginsName>
      <PluginsAttemptNo>1</PluginsAttemptNo>
      <PluginsStatus>Success</PluginsStatus>
      <PluginsStartTime>2015-05-10 20:03:14.002 +0000</PluginsStartTime>
      <PluginsEndTime>2015-05-10 20:03:16.573 +0000</PluginsEndTime>
      <PluginsDuration>0 min, 2 sec, 571 millis</PluginsDuration>
      <PluginsLogFiles>
        <PluginsLogFileName>abc.log</PluginsLogFileName>
        <PluginsLogFileLink>/tmp/abc.lo</PluginsLogFileLink>
        <PluginsLogFileErrors>No Errors</PluginsLogFileErrors>
      </PluginsLogFiles>
      <PluginsLogFiles>
        <PluginsLogFileName>abc.log</PluginsLogFileName>
        <PluginsLogFileLink>/tmp/abc.log</PluginsLogFileLink>
        <PluginsLogFileErrors>No Errors</PluginsLogFileErrors>
      </PluginsLogFiles>
      <PluginsLogFiles>
        <PluginsLogFileName>abc.log</PluginsLogFileName>
        <PluginsLogFileLink>/tmp/abc.log</PluginsLogFileLink>
        <PluginsLogFileErrors>No Errors</PluginsLogFileErrors>
      </PluginsLogFiles>
      <PluginsErrors>No Errors</PluginsErrors>
    </Plugins>
    <Plugins>
      <PluginsRunningSeq>3</PluginsRunningSeq>
      <PluginspatchLogName>abc_patch.log</PluginspatchLogName>
      <PluginsName>Download Patching</PluginsName>
      <PluginsAttemptNo>1</PluginsAttemptNo>
      <PluginsStatus>Success</PluginsStatus>
      <PluginsStartTime>2015-05-10 20:03:18.863 +0000</PluginsStartTime>
      <PluginsEndTime>2015-05-10 20:03:29.983 +0000</PluginsEndTime>
      <PluginsDuration>0 min, 11 sec, 120 millis</PluginsDuration>
      <PluginsLogFiles>
        <PluginsLogFileName>abc.log</PluginsLogFileName>
        <PluginsLogFileLink>/tmp/abc.log</PluginsLogFileLink>
        <PluginsLogFileErrors>No Errors</PluginsLogFileErrors>
      </PluginsLogFiles>
      <PluginsLogFiles>
        <PluginsLogFileName>abc.log</PluginsLogFileName>
        <PluginsLogFileLink>/tmp/abc.log</PluginsLogFileLink>
        <PluginsLogFileErrors>No Errors</PluginsLogFileErrors>
      </PluginsLogFiles>
      <PluginsErrors>No Errors</PluginsErrors>
    </Plugins>
    <Plugins>
    <installerStartTime>2015-05-10 20:02:46.651 +0000</installerStartTime>
    <installerEndTime>2015-05-10 21:37:47.428 +0000</installerEndTime>
  </installer>

我可以使用以下代码基于PluginsName创建哈希映射。但是,我无法继续

my $pluginDetails = XMLin('/tmp/Installer.xml', KeyAttr => {Plugins => 'PluginsName'});

有人可以帮忙吗?

清醒

不要使用XML::Simple谎言-用于简单的XML。甚至在自己的页面上也说:“不鼓励在新代码中使用此模块。其他模块也可以提供更直接和一致的界面”

另请注意-您发布的XML格式不正确。通过最后删除几行,我创建了这个示例,但是您应该确保将有效的XML发布到任何XML问题上。

考虑到这一点-我XML::Twig个人很喜欢

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;
use Data::Dumper;

my @desired = qw ( PluginsStatus PluginspatchLogName  );

my %plugin_data; 

sub process_plugin {
    my ( $twig, $plugin ) = @_;
    my $name = $plugin -> first_child_text('PluginsName');
    foreach my $tag ( @desired ) { 
       if ( $plugin -> first_child_text($tag) ) {
          $plugin_data{$name}{$tag} = $plugin -> first_child_text($tag);
       }
    }
    my $logfile = $plugin -> first_child ('PluginsLogFiles') -> first_child_text('PluginsLogFileName');
    $plugin_data{$name}{'PluginLogFileName'} = $logfile;
    my $errors =  $plugin -> first_child ('PluginsLogFiles') -> first_child_text('PluginsLogFileErrors'); 
    $plugin_data{$name}{'PluginsLogFileErrors'} = $errors; 
}

my $twig = XML::Twig -> new ( twig_handlers => { 'Plugins' => \&process_plugin } ) -> parse ( \*DATA );
print Dumper \%plugin_data;


__DATA__
<installer>
    <Plugins>
      <PluginsRunningSeq>1</PluginsRunningSeq>
      <PluginspatchLogName>abc_patch.log</PluginspatchLogName>
      <PluginsName>ConfigValue</PluginsName>
      <PluginsAttemptNo>1</PluginsAttemptNo>
      <PluginsStatus>Success</PluginsStatus>
      <PluginsStartTime>2015-05-10 20:02:46.651 +0000</PluginsStartTime>
      <PluginsEndTime>2015-05-10 20:03:14.002 +0000</PluginsEndTime>
      <PluginsDuration>0 min, 27 sec, 351 millis</PluginsDuration>
      <PluginsLogFiles>
        <PluginsLogFileName>abc.log</PluginsLogFileName>
        <PluginsLogFileLink>/tmp/abc.log</PluginsLogFileLink>
        <PluginsLogFileErrors>No Errors</PluginsLogFileErrors>
      </PluginsLogFiles>
      <PluginsErrors>No Errors</PluginsErrors>
    </Plugins>
    <Plugins>
      <PluginsRunningSeq>2</PluginsRunningSeq>
      <PluginspatchLogName>abc_patch_patch.log</PluginspatchLogName>
      <PluginsName>Patching Manager</PluginsName>
      <PluginsAttemptNo>1</PluginsAttemptNo>
      <PluginsStatus>Success</PluginsStatus>
      <PluginsStartTime>2015-05-10 20:03:14.002 +0000</PluginsStartTime>
      <PluginsEndTime>2015-05-10 20:03:16.573 +0000</PluginsEndTime>
      <PluginsDuration>0 min, 2 sec, 571 millis</PluginsDuration>
      <PluginsLogFiles>
        <PluginsLogFileName>abc.log</PluginsLogFileName>
        <PluginsLogFileLink>/tmp/abc.lo</PluginsLogFileLink>
        <PluginsLogFileErrors>No Errors</PluginsLogFileErrors>
      </PluginsLogFiles>
      <PluginsLogFiles>
        <PluginsLogFileName>abc.log</PluginsLogFileName>
        <PluginsLogFileLink>/tmp/abc.log</PluginsLogFileLink>
        <PluginsLogFileErrors>No Errors</PluginsLogFileErrors>
      </PluginsLogFiles>
      <PluginsLogFiles>
        <PluginsLogFileName>abc.log</PluginsLogFileName>
        <PluginsLogFileLink>/tmp/abc.log</PluginsLogFileLink>
        <PluginsLogFileErrors>No Errors</PluginsLogFileErrors>
      </PluginsLogFiles>
      <PluginsErrors>No Errors</PluginsErrors>
    </Plugins>
    <Plugins>
      <PluginsRunningSeq>3</PluginsRunningSeq>
      <PluginspatchLogName>abc_patch.log</PluginspatchLogName>
      <PluginsName>Download Patching</PluginsName>
      <PluginsAttemptNo>1</PluginsAttemptNo>
      <PluginsStatus>Success</PluginsStatus>
      <PluginsStartTime>2015-05-10 20:03:18.863 +0000</PluginsStartTime>
      <PluginsEndTime>2015-05-10 20:03:29.983 +0000</PluginsEndTime>
      <PluginsDuration>0 min, 11 sec, 120 millis</PluginsDuration>
      <PluginsLogFiles>
        <PluginsLogFileName>abc.log</PluginsLogFileName>
        <PluginsLogFileLink>/tmp/abc.log</PluginsLogFileLink>
        <PluginsLogFileErrors>No Errors</PluginsLogFileErrors>
      </PluginsLogFiles>
      <PluginsLogFiles>
        <PluginsLogFileName>abc.log</PluginsLogFileName>
        <PluginsLogFileLink>/tmp/abc.log</PluginsLogFileLink>
        <PluginsLogFileErrors>No Errors</PluginsLogFileErrors>
      </PluginsLogFiles>
      <PluginsErrors>No Errors</PluginsErrors>
    </Plugins>

  </installer>

将打印:

$VAR1 = {
          'Patching Manager' => {
                                'PluginsLogFileErrors' => 'No Errors',
                                'PluginsStatus' => 'Success',
                                'PluginspatchLogName' => 'abc_patch_patch.log',
                                'PluginLogFileName' => 'abc.log'
                              },
          'Download Patching' => {
                                 'PluginspatchLogName' => 'abc_patch.log',
                                 'PluginLogFileName' => 'abc.log',
                                 'PluginsLogFileErrors' => 'No Errors',
                                 'PluginsStatus' => 'Success'
                               },
          'ConfigValue' => {
                           'PluginLogFileName' => 'abc.log',
                           'PluginspatchLogName' => 'abc_patch.log',
                           'PluginsStatus' => 'Success',
                           'PluginsLogFileErrors' => 'No Errors'
                         }
        };

不过请注意-它不会PluginsLogFiles以任何宽限期处理重复的元素-它只会看第一个。您可以很容易地完成多个操作,但是然后您需要弄清楚这是否将是一个单独的哈希键(因为您不能使用重复),或者您要在哈希中插入一个数组。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章