我有一个xml文件,如下所示。在perl中,我尝试使用hash键use XML::Simple; utility
在哪里PluginsName
,而Plugin详细信息的其余部分应为值。
所以,我想取以下值:PluginsName
,PluginsStatus
,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>
我可以使用以下代码基于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] 删除。
我来说两句