我正在尝试在Unix中创建一个脚本来解析嵌套的XML。以下示例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<deployments>
<appName>apptest</appName>
<envVariable>app</envVariable>
<fileSourceFolder>/sourceTest</fileSourceFolder>
<fileBackupFolder>/testbackup</fileBackupFolder>
<requireRestart>false</requireRestart>
<restartCommandPath>bin</restartCommandPath>
<deployment-files>
<deployment-file>
<deploymentFolder>deployment-folder</deploymentFolder>
<fileName>test-file</fileName>
</deployment-file>
</deployment-files>
<restart-commands>
<restart-command>
<commandName>./appstop</commandName>
</restart-command>
<restart-command>
<commandName>./appstart</commandName>
</restart-command>
</restart-commands>
</deployments>
我需要遍历 deployment-files 和 restart-command 元素。我读到了使用Perl,安装的版本是5.8.8。但是由于缺少库,我不能在perl中使用TWIG和其他XML东西。我读了很多其他的东西,比如xml_grep,xmllint等,但是那些没有安装在我使用的机器上,我不能手动安装它们甚至因为很多约束而请求它。
我已经尝试使用基于http://interoperating.info/courses/perl4data/node/26示例的XML :: Simple,但仍然没有用。
请告知如何为此创建最简单的perl或shell脚本,并提供参考。我仍然是shell脚本的新手,我昨天刚刚开始探索perl,所以我将非常感谢你的帮助。谢谢。
答案 0 :(得分:1)
看,我知道你说'我不能安装东西&#39; - 但是你遇到的问题是你在没有解析器的情况下尝试解析XML,并且你正在使用一个7年历史的perl版本。 Perl 5.8.8 is end of life, and released in 2008。
这不是一条通向良好解决方案的途径,无论你怎么努力尝试 - 使用解析器,这变得非常简单:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig -> new -> parse ( \*DATA );
foreach my $deployment_files ( $twig -> get_xpath ( '//deployment-file' ) ) {
print $deployment_files -> first_child_text('deploymentFolder'), " => ";
print $deployment_files -> first_child_text('fileName');
print "\n";
}
foreach my $restart_command ( $twig -> get_xpath ( '//restart-command/commandName' ) ) {
print $restart_command -> text,"\n";
}
__DATA__
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<deployments>
<appName>apptest</appName>
<envVariable>app</envVariable>
<fileSourceFolder>/sourceTest</fileSourceFolder>
<fileBackupFolder>/testbackup</fileBackupFolder>
<requireRestart>false</requireRestart>
<restartCommandPath>bin</restartCommandPath>
<deployment-files>
<deployment-file>
<deploymentFolder>deployment-folder</deploymentFolder>
<fileName>test-file</fileName>
</deployment-file>
</deployment-files>
<restart-commands>
<restart-command>
<commandName>./appstop</commandName>
</restart-command>
<restart-command>
<commandName>./appstart</commandName>
</restart-command>
</restart-commands>
</deployments>
没有解析器,你首先......必须编写一个解析器。你可以这样做 - 规范定义明确。但实际上,当有几个好的XML解析器可供测试和工作时,没有任何意义。但即使你这样做了,你也会在一位7岁的口译员身上跑步。实现perl的源代码构建并安装在备用位置并不困难。
所以我建议这里的正确的答案涉及要求必要的元素来做一份体面的工作。你不会指望木匠用锤子砸碎你的锤子,因为他不愿意购买螺丝刀,现在好吗?