首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不是导航XML::Simple结构的数组引用

不是导航XML::Simple结构的数组引用
EN

Stack Overflow用户
提问于 2015-12-16 17:37:23
回答 3查看 79关注 0票数 0

我是Perl的新手。我试图对xml文件中的每个条目进行循环,以执行一个任务,但它以“不是第9行的数组引用”告终。

我的脚本是

代码语言:javascript
复制
#!/usr/bin/perl
# use module
use XML::Simple;
# create object
$xml = new XML::Simple;
# read XML file
$data = $xml->XMLin("data.xml");
# access XML data
foreach my $entry (@{$data->{entry}}){
print $entry->{'source-translation'}->{'static-ip'}-{'translated-address'};
}

我的XML文件数据是

代码语言:javascript
复制
<?xml version="1.0"?>
<config version="6.0.0" urldb="paloaltonetworks">
  <entry name="DROP NAT">
    <source-translation>
      <static-ip>
        <bi-directional>yes</bi-directional>
        <translated-address>192.91.75.129</translated-address>
      </static-ip>
    </source-translation>
    <to>
      <member>Outside</member>
    </to>
    <from>
      <member>DROP</member>
    </from>
    <source>
      <member>192.91.66.72</member>
    </source>
    <destination>
      <member>any</member>
    </destination>
    <service>any</service>
    <description>NAT for DROP FTP Server</description>
    <to-interface>ethernet1/1</to-interface>
    <nat-type>ipv4</nat-type>
  </entry>
  <entry name="SDROP NAT">
    <source-translation>
      <static-ip>
        <bi-directional>yes</bi-directional>
        <translated-address>192.91.75.154</translated-address>
      </static-ip>
    </source-translation>
    <to>
      <member>Outside</member>
    </to>
    <from>
      <member>DROP</member>
    </from>
    <source>
      <member>192.91.66.79</member>
    </source>
    <destination>
      <member>any</member>
    </destination>
    <service>any</service>
    <description>NAT for SFTP server SDROP</description>
    <to-interface>ethernet1/1</to-interface>
    <nat-type>ipv4</nat-type>
  </entry>
</config>

我想在每个条目中列出转换后的地址。假设有很多这样的条目。请帮帮我。

EN

回答 3

Stack Overflow用户

发布于 2015-12-17 01:06:55

KeyAttr选项的缺省值为

代码语言:javascript
复制
KeyAttr => [qw( name key id )]

这意味着XML::Simple将转换

代码语言:javascript
复制
 [ { name => $name1, ... }, { name => $name2, ... }, ... ]

转到

代码语言:javascript
复制
 { $name1 => { ... }, $name2 => { ... }, ... }

你可以使用下面的选项来获得你想要的结构。

代码语言:javascript
复制
KeyAttr => []

如果您希望代码在只有一个条目的情况下工作,请不要忘记提供以下选项:

代码语言:javascript
复制
ForceArray => [qw( entry )]

Simple的使用是discouraged的,即使它自己的文档也是如此。

XML::LibXML解决方案:

代码语言:javascript
复制
use XML::LibXML qw( );
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file('data.xml');
for my $node ($doc->findnodes(
   '/config/entry/source-translation/static-ip/translated-address'
)) {
   print($node->textContent(), "\n");
}
票数 1
EN

Stack Overflow用户

发布于 2015-12-16 19:10:14

正如您所说的,$data->{entry}不是数据结构中的数组引用;它是一个散列引用。

检查下面的脚本,它访问散列中的数据:

代码语言:javascript
复制
#!/usr/bin/perl
use v5.10; use strict; use warnings;
use XML::Simple;

my $xml = new XML::Simple;
my $data = $xml->XMLin("data.xml");
for my $entry (keys %{$data->{entry}}){
  say $data->{entry}->{$entry}->{'source-translation'}->{'static-ip'}->{'translated-address'};
}

正如Сухой27指出的那样;如果您使用Data::Dumper,您将能够看到数据结构,并且您将看到散列,而不是假设的数组。

票数 0
EN

Stack Overflow用户

发布于 2015-12-17 07:04:16

这就是你的问题:

代码语言:javascript
复制
use XML::Simple;

XML::Simple误导了您。这一点都不简单。除非您完全别无选择(很可能是这样--它不是核心),否则使用另一个解析器就不那么痛苦了。

像这样:

代码语言:javascript
复制
use XML::Twig;
print $_ -> trimmed_text,"\n" for  XML::Twig -> new -> parsefile ( 'data.xml') -> get_xpath ( '//translated-address');

向外扩展更像是:

代码语言:javascript
复制
use strict ;
use warnings;
my $twig = XML::Twig -> new;
$twig -> parsefile ( 'data.xml');
foreach my $entry ( $twig -> findnodes ('//entry'))  {
    print $entry -> first_child('source-translation') -> first_child('static-ip') -> first_child_text('translated-address');
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34308439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档