【问题标题】:How do I access deep data in a nested XML structure in Perl using XML::Simple?如何使用 XML::Simple 在 Perl 中访问嵌套 XML 结构中的深层数据?
【发布时间】:2009-06-22 12:12:06
【问题描述】:

我正在使用 XML::Simple,并且我在变量 $xmldata 中有以下 XML 结构,我需要通过 Perl 代码访问它。

<root>
    <a>sfghs</a>
    <b>agaga</b>
    <c>
       <c1>sgsfs</c1>
       <c2>sgsrsh</c2>
    </c>
    <d>
        <d1>agaga</d1>
        <d2>asgsg</d2>
    </d>
</root>

我可以使用以下代码访问 a 和 b 的值:

$aval = $xmldata->{a}[0];
$bval = $xmldata->{b}[0] ;

现在,我的问题是:我怎样才能得到 say, d2 的值?

【问题讨论】:

  • 我已经删除了我的答案。您应该将 newt 的答案标记为正确答案,因为它可以解决您的问题。

标签: xml perl xml-simple


【解决方案1】:

鉴于上述情况,我假设您启用了 ForceArray 标志。 嵌套键使用引用存储为散列的散列。

因此,要访问“d2”,您需要使用:

my $d2val = $xmldata->{d}[0]->{d2}[0];

(或我的偏好)

my $d2val = $xmldata->{d}->[0]->{d2}->[0];

(因为它使 deref 显而易见)

显然,你越深入,这就越可怕。这就是我几乎总是建议使用XML::LibXML 和 XPath 而不是 XML::Simple 的原因之一。 XML::Simple 迅速变得不简单。 XML::Simple docs 解释各种选项如何影响此布局。

Data::Dumper 在您想了解数据的布局时非常有用。

【讨论】:

  • @newt 仅供参考:我删除了我的答案并将对 Data::Dumper 的引用放在这里,以便有一个可以标记为正确的完整答案。
  • 不应该是我的 $d2val = $xmldata->{'d'}[0]{'d2'}[0];? (区别在于 {'d'} 之后的 [0],仍然假定 ForceArray => 1。)对于较大的文档,我喜欢 XML::Parser::PerlSAX(无论你做什么,一旦你的文档变得很大,不要使用 DOM -解析它们)。
  • @Anon,是的,你是绝对正确的。我的错。更正了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多