代码之家  ›  专栏  ›  技术社区  ›  Freddy

如何从Perl中的XML文件中提取和保存值?

  •  4
  • Freddy  · 技术社区  · 16 年前

    下面是我在Perl脚本中要做的:

    $data="";
    sub loadXMLConfig()
    {
         $filename="somexml.xml"
         $data = $xml->XMLin($filename);
    }
    
    sub GetVariable()
    {
         ($FriendlyName) = @_;
         switch($FriendlyName)
         {
             case "My Friendly Name" {print $data->{my_xml_tag_name}}
             ....
             ....
             ....
          }
    }
    

    问题是我使用Perl仅仅是因为我正在从一个XML文件中读取数据,但是我需要通过一个shell脚本来获取这些变量。所以,我使用的是:

    $ perl -e 'require "scrpt.pl"; loadConfigFile(); GetVariable("My Variable")' 
    

    这和预期的完全一样,但每次获取变量时,我都需要读取XML文件。我有办法“保存”吗? $data 通过shell调用?我的想法是只读取一次XML文件。如果没有,有没有更简单的方法可以做到这一点?这些是我无法改变的:

    • 配置文件是XML
    • 需要shell脚本中的变量
    3 回复  |  直到 16 年前
        1
  •  5
  •   codeholic    16 年前

    当我需要一些由Perl检索到的信息时,在shell脚本中,我通过Perl生成shell脚本,并通过 eval :

    myscript

    #!/bin/bash
    BINDIR=`dirname $0`
    CONFIG=$BINDIR/config.xml
    eval `$BINDIR/readcfg $CONFIG`
    echo Running on the $planet near the $star.
    

    readcfg

    #!/usr/bin/perl
    use XML::Simple;
    my $xml = XMLin('config.xml', VarAttr => 'name', ContentKey => '-content');
    while (my ($k, $v) = each %{$xml->{param}}) {
        $v =~ s/'/'"'"'/g;
        $v = "'$v'";
        print "export $k=$v\n";
    }
    

    config.xml

    <config>
        <param name="star">Sun</param>
        <param name="planet">Earth</param>
    </config>
    
        2
  •  2
  •   brian d foy    16 年前

    您可以分两步完成此操作。如果您还没有创建存储的Perl数据结构,那么您需要创建一个存储的Perl数据结构;如果已经创建了,那么您就可以创建存储的版本,这样您就不必再次解析它了。

    有很多方法可以做到这一点,但这里有一个版本使用 Storable :

     use Storable qw(nstore retrieve);
    
     my $stored_data_structure = 'some_file_name';
    
     my $data = do {
          # from the stored data structure if it is there
          if( -e $stored_data_structure ) {
               retrieve( $stored_data_structure );
               }
          # otherwise parse the xml and store it
          else {
               my $data = $xml->XMLin( $xml_filename );
               nstore( $data, $stored_data_structure );
               $data;
               }
          };
    

    你也可以考虑改变你的概念。不要让调用Perl脚本的shell脚本调用shell脚本:

     # load the data, as before
    
     # set some environment variables
     $ENV{SomeThing} = $data->{SomeThing};
    
     # now that the environment is set up
     # turn into the shell script
     exec '/bin/bash', 'script_name'
    
        3
  •  1
  •   DVK    16 年前

    您可以简单地将这些值存储在shell可执行文件中。 假设BourneShell(sh)脚本,并且您事先知道您感兴趣的变量名列表:

    $data="";
    sub loadXMLConfig()
    {
         $filename="somexml.xml"
         $data = $xml->XMLin($filename);
    }
    
    sub GetVariable()
    {
         ($FriendlyName) = @_;
         switch($FriendlyName)
         {
             case "My Friendly Name" {
                 print "$FriendlyName='$data->{my_xml_tag_name}'; export $FriendlyName\n"
             } # Use "export var=value" form for bash
             ....
             ....
             ....
          }
    }
    
    sub storeVariables {
        # @variables list defined elsewhere - this is just a sketch
        foreach my $variable (@variables) { 
            GetVariable($variable);
        }
    }
    

    然后调用如下:

    $ perl -e 'require "scrpt.pl"; loadConfigFile(); storeVariables();' > my_vars.sh
    $ source my_vars.sh 
    

    我的“vars.sh”可以多次获得