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