用perl读取XML文件

用perl读取XML文件,xml,perl,Xml,Perl,我有一个xml文件,如下所示。在perl中,我试图使用使用XML::Simple;实用工具wherePluginsName应该是散列键,其余的插件细节应该是值 因此,我想获取以下值:PluginsName,pluginstatus,PluginspatchLogName,PluginsLogFileName和PluginsLogFileErrors,它们位于标记PluginsLogFiles中 基本上我想要一个给定的PluginsName <installer> <Plug

我有一个xml文件,如下所示。在perl中,我试图使用
使用XML::Simple;实用工具
where
PluginsName
应该是散列键,其余的插件细节应该是值

因此,我想获取以下值:
PluginsName
pluginstatus
PluginspatchLogName
PluginsLogFileName
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>

1.
abc_patch.log
配置值
1.
成功
2015-05-10 20:02:46.651 +0000
2015-05-10 20:03:14.002 +0000
0分钟27秒351毫秒
abc.log
/tmp/abc.log
没有错误
没有错误
2.
abc_patch_patch.log
补丁管理器
1.
成功
2015-05-10 20:03:14.002 +0000
2015-05-10 20:03:16.573 +0000
0分钟2秒571毫秒
abc.log
/tmp/abc.lo
没有错误
abc.log
/tmp/abc.log
没有错误
abc.log
/tmp/abc.log
没有错误
没有错误
3.
abc_patch.log
下载补丁
1.
成功
2015-05-10 20:03:18.863 +0000
2015-05-10 20:03:29.983 +0000
0分钟11秒120毫秒
abc.log
/tmp/abc.log
没有错误
abc.log
/tmp/abc.log
没有错误
没有错误
2015-05-10 20:02:46.651 +0000
2015-05-10 21:37:47.428 +0000

我能够使用下面的代码创建一个基于PluginsName的哈希映射。但是,我无法继续下去

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

有人能帮忙吗?

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

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

考虑到这一点,我个人喜欢

#!/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>

不过请注意——它不会以任何优雅的方式处理重复的
PluginsLogFiles
元素——它只处理第一个元素。您可以很容易地执行多个操作,但是您需要确定这是一个单独的哈希键(因为您不能有重复项),还是要在哈希中插入一个数组

我建议您使用或而不是笨拙的
XML::Simple

此解决方案使用
XML::LibXML
,并使用
Data::Dump
显示结果哈希

use strict;
use warnings;

use XML::LibXML;
use Data::Dump;

my $xml = XML::LibXML->load_xml(location => 'plugins.xml');

my %plugins;

for my $plugin ( $xml->findnodes('/root/installer/Plugins') ) {

  my $name = $plugin->findvalue('PluginsName');

  for my $info ( $plugin->findnodes('*') ) {

    my @elements = $info->findnodes('*');
    @elements = ($info) unless @elements;

    $plugins{$name}{$_->localname} = $_->textContent for @elements;
  }
}

use Data::Dump;
dd \%plugins;
输出

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

请不要使用。很难得到你所需要的结果,而且它是基于一个固有的错误设计。它自己的文档中说“不鼓励在新代码中使用此模块。可以使用其他模块,这些模块提供更直观和一致的接口。特别是,强烈建议”您的XML数据格式不正确,因此没有任何东西可以处理它。请显示真实数据,并且-请包括您想要的具体内容。出现以下错误:无法在@INC中找到auto/XML/LibXML/load_XML.al(@INC包含:/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/usr/lib/perl5/site_perl/5.8.8/usr/libl5/site_perl/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-linux-thread-multi/usr/lib/vendor_perl/5.8.8/usr/lib/lib/perl5.8/vendoor/vendoor_perl供应商_perl perl/usr/usr/usr/usr/lib.64/lib.8/x88/x88/linux-perl5.8/perl.8/perl.8/perl.64-perl在readXML.pl第8行,模块use XML::LibXML;不是present@ArunShankar:您尚未正确安装
XML::LibXML
。我猜您刚刚将其复制到位?您需要构建它感谢您的快速响应。正在开发的工具需要在不考虑机器的情况下运行。因此,我无法安装新库。Moreo如果我也没有特权,请告诉我你是否有什么建议谢谢,这对我很有用。这真的很有用。你能帮助我使用单独的散列键处理重复的PluginsLogFiles元素吗(可能像PluginLogFileName1,PluginsLogFileErrors1和PluginLogFileName2,PluginsLogFileErrors2)??但是,需要注意的是,很少有插件有多个PluginsLogFiles子元素,有些插件只有一个子元素。因此,它不是硬编码的。如果您能在这里帮助我,我将不胜感激。请查看
XML::Twig
文档中的
子项
。这可以让您迭代匹配标准的节点-例如
$Plugin->children('PluginsLogFiles');
。类似于
foreach my$logfile($plugin->children('PluginsLogFiles'){
——然后你可以提取并添加你想要的元素,或者将它们推到数组上,或者添加一个新的哈希键。这正是我想要的。非常感谢@Sobrique.。这是非常需要的帮助。
{
  "" => {
    installerEndTime   => "2015-05-10 21:37:47.428 +0000",
    installerStartTime => "2015-05-10 20:02:46.651 +0000",
  },
  "ConfigValue" => {
    PluginsAttemptNo     => 1,
    PluginsDuration      => "0 min, 27 sec, 351 millis",
    PluginsEndTime       => "2015-05-10 20:03:14.002 +0000",
    PluginsErrors        => "No Errors",
    PluginsLogFileErrors => "No Errors",
    PluginsLogFileLink   => "/tmp/abc.log",
    PluginsLogFileName   => "abc.log",
    PluginsName          => "ConfigValue",
    PluginspatchLogName  => "abc_patch.log",
    PluginsRunningSeq    => 1,
    PluginsStartTime     => "2015-05-10 20:02:46.651 +0000",
    PluginsStatus        => "Success",
  },
  "Download Patching" => {
    PluginsAttemptNo     => 1,
    PluginsDuration      => "0 min, 11 sec, 120 millis",
    PluginsEndTime       => "2015-05-10 20:03:29.983 +0000",
    PluginsErrors        => "No Errors",
    PluginsLogFileErrors => "No Errors",
    PluginsLogFileLink   => "/tmp/abc.log",
    PluginsLogFileName   => "abc.log",
    PluginsName          => "Download Patching",
    PluginspatchLogName  => "abc_patch.log",
    PluginsRunningSeq    => 3,
    PluginsStartTime     => "2015-05-10 20:03:18.863 +0000",
    PluginsStatus        => "Success",
  },
  "Patching Manager" => {
    PluginsAttemptNo     => 1,
    PluginsDuration      => "0 min, 2 sec, 571 millis",
    PluginsEndTime       => "2015-05-10 20:03:16.573 +0000",
    PluginsErrors        => "No Errors",
    PluginsLogFileErrors => "No Errors",
    PluginsLogFileLink   => "/tmp/abc.log",
    PluginsLogFileName   => "abc.log",
    PluginsName          => "Patching Manager",
    PluginspatchLogName  => "abc_patch_patch.log",
    PluginsRunningSeq    => 2,
    PluginsStartTime     => "2015-05-10 20:03:14.002 +0000",
    PluginsStatus        => "Success",
  },
}