【问题标题】:Perl XML parserPerl XML 解析器
【发布时间】:2013-11-15 12:51:57
【问题描述】:

我有一个使用XML::Parser Perl 模块解析的XML 文件。解析XML的代码:

..........................................
$parser = XML::Parser->new(Style => 'Tree');
$my_map = $parser->parse($xml);
print Dumper($my_map->[1]) . "\n";

print Dumper($my_map->[1]) 语句的结果:

$VAR1 = [
          {},
          0,
          '
            ',
          'lfs',
          [
            {
              'name' => 'ABC'
            },
            0,
            '
                 ',
            'FS',
            [
              {
                'status' => '1',
                'acc' => '/tmp',
                'kind' => 'ass'
              }
            ],
            0,
            '
            '
          ],
          0,
          '
            ',
          'lfs',
          [
            {
              'name' => 'BCG'
            },
            0,
            '
                 ',
            'FS',
            [
              {
                'status' => '1',
                'acc' => '/home/tmpspace/tmp1',
                'kind' => 'oops'
              }
            ],
            0,
            '
                 ',
            'FS',
            [
              {
                'status' => '1',
                'acc' => '/home/tmpspace/tmp2',
                'kind' => 'hops'
              }
            ],
            0,
            '
            '
          ],
          0,
          '
            ',
          'lfs',
          [
            {
              'name' => 'KMN'
            },
            0,
            '
                 ',
            'FS',
            [
              {
                'status' => '1',
                'acc' => '/misc/ib',
                'kind' => 'nops'
              }
            ],
            0,
            '
            '
          ],
          0,
          '
            ',
          'lfs',
          [
            {
              'name' => 'MAIN'
            },
            0,
            '
                 ',
            'FS',
            [
              {
                'status' => '1',
                'acc' => 'This is the string that I wanted.',
                'kind' => 'mount'
              }
            ],
            0,
            '
            '
          ],
          0,
          '
    '
        ];

$my_map->[1],我想得到'acc' => 'This is the string that I wanted.'。如何有效地获取'acc' => 'This is the string that I wanted.'

【问题讨论】:

    标签: xml perl xml-parsing


    【解决方案1】:

    我建议您考虑使用XML::LibXML 而不是XML::Parser,然后使用XPath 表示法在您的XML 中查找特定元素(通过findnodes() 方法)。

    这样做可以让您获得 XML 文档中的某些节点,而无需完全了解其完整结构(或者,取决于以特定方式格式化的源 XML)。

    XML::LibXML 是described here,而您可以在XPath notation here 上获得更多信息。

    【讨论】:

    • 感谢您的回答。我同意 XML:LibXML 要好得多。但是使用 XML::Parser 是一种强迫行为。 :(
    • 另一种可能性是使用XML::Twig。比XML::Parser好用,而且是纯perl,所以安装或使用大概比XML::LibXML容易。
    • 如果底层库不太可能可用,我可以理解关于使用纯 perl 解决方案的争论......但是,libxml2 几乎无处不在;没有它,大多数现代 Linux 发行版都无法运行。此外,它速度极快:D(而且超级强大)
    【解决方案2】:

    尝试这样做,迭代每个 ARRAY 级别:

    use strict; use warnings;
    
    foreach my $first_level (@$VAR1) {
        if(ref $first_level eq "ARRAY") {
            foreach my $second_level (@{ $first_level }) {
                if(ref $second_level eq "ARRAY") {
                    foreach my $third_level (@{ $second_level }) {
                        print $third_level->{acc}, "\n";
                    }
                }
            }
        }
    }
    

    【讨论】:

    • POST编辑,更好的编码风格,更短更高效。
    猜你喜欢
    • 2013-07-24
    • 2012-09-10
    • 2011-08-08
    • 2011-03-25
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多