【问题标题】:Simplest Nested XML Parsing in AIXAIX 中最简单的嵌套 XML 解析
【发布时间】:2016-03-28 11:17:23
【问题描述】:

我正在尝试在 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-filesrestart-command 元素。我阅读了有关使用 Perl 的信息,安装的版本是 5.8.8。但是由于缺少库,我不能在 perl 中使用 TWIG 和其他 XML 内容。我也读过其他东西,比如 xml_grep、xmllint 等,但这些东西没有安装在我使用的机器上,由于很多限制,我无法手动安装它们,甚至无法请求它。

我已经尝试使用基于 http://interoperating.info/courses/perl4data/node/26 的示例的 XML::Simple,但仍然不行。

请告知如何为此创建最简单的 perl 或 shell 脚本,并提供参考。我还是 shell 脚本的新手,我昨天才开始探索 perl,所以我将感谢您的所有帮助。谢谢。

【问题讨论】:

  • 你自己尝试过什么吗?
  • 是的,我确实从互联网上尝试了很多东西。我试图修改这些以满足我的需要,但仍然不能满足我的要求。我基本上是 shell 脚本的新手,昨天我刚刚尝试了 perl,所以我真的需要帮助。非常感谢您提前耐心等待
  • 你能发布至少一件事来表明你的努力吗?
  • 最好的办法是安装一个 XML 工具。如果您无权在系统范围内安装一个,您可以在您的主目录中安装。有关在本地安装 perl 模块的详细信息,请参阅this question(以及其中链接的问题)。
  • 不要使用 XML::Simple。阅读此Why is XML::Simple “Discouraged”? 并使用编辑按钮将您的代码添加到您的问题中。不要在注释中写代码。

标签: xml linux perl shell


【解决方案1】:

看,我知道你说过“我无法安装东西”——但你遇到的问题是你试图在没有解析器的情况下解析 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 的源代码构建并安装在另一个位置真的不难。

因此,我建议正确 的答案涉及请求必要的元素来完成体面的工作。你不会指望木匠会围着你的锤子用锤子砸螺丝,因为他不会费心去弄螺丝刀,你会吗?

【讨论】:

  • 我尝试使用 Twig,但我总是遇到 Can't locate XML/Twig.pm in @INC 错误。最初的计划是向部署团队提供我们制作的任何脚本,以自动复制/备份文件并重新启动应用程序。如果需要额外的库来执行此操作(例如 Xml 解析器库),这将首先通过一系列请求和大量解释。 mgmt 对 prod 服务器中的任何修改都非常严格。无论如何,我仍然会尝试在我的测试机器上做任何可能的事情,并希望它能够在 prod 上实现。非常感谢您的帮助。
  • 变更控制是关于控制变更。没关系。你有改变和做出改变的理由。这是关于制作可重复的可支持代码 - 这是做出改变的理由。
猜你喜欢
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2022-01-04
相关资源
最近更新 更多