【问题标题】:Parsing xml in perl produce output in different format than I expect在 perl 中解析 xml 产生的输出格式与我预期的不同
【发布时间】:2016-07-18 05:15:37
【问题描述】:

我对 perl 很陌生。我正在尝试使用 perl xml 解析模块 XML::Simple 解析 xml 文件。 下面是我试图解析的示例 xml:

<?xml version="1.0" encoding="US-ASCII"?>
<book>
    <key>ISBN1</key>
    <str>name1</str>
    <key>ISBN2</key>
    <str>name2</str>
    <key>ISBN3</key>
    <str>name3</str>
    <key>ISBN4</key>
    <str>name4</str>
    <key>ISBN5</key>
    <str>name5</str>
    <key>ISBN6</key>
    <str>name6</str>
</book>

下面是我用来解析和转储解析输出的 perl 程序:

my $xml = XML::Simple->new;
my $data = $xml->XMLin($bookMap);
print Dumper($data);

输出是:

$VAR1 = {
          'str' => [
                   'name1',
                   'name2',
                   'name3',
                   'name4',
                   'name5',
                   'name6'
                 ],
          'key' => [
                   'ISBN1',
                   'ISBN2',
                   'ISBN3',
                   'ISBN4',
                   'ISBN5',
                   'ISBN6'
                 ]
        };

但我需要将其解析为以下格式:

$VAR1 = {
          'ISBN1' => 'name1',
          'ISBN2' => 'name2',
          'ISBN3' => 'name3',
          'ISBN4' => 'name4',
          'ISBN5' => 'name5',
          'ISBN6' => 'name6',
};

看来我的 xml 格式与 perl xml 解析器所期望的格式不同。有人可以帮我找到更好的方法来获得预期的输出吗?

提前致谢。

【问题讨论】:

标签: xml perl parsing


【解决方案1】:

拜托拜托-不要使用XML::Simple。这是气馁。

#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
use Data::Dumper; 

my $twig = XML::Twig -> new -> parsefile($fuseMap);

my %data; 

my @keys = map { $_ -> text } $twig -> get_xpath('//key'); 
my @strs = map { $_ -> text } $twig -> get_xpath('//str');

@data{@keys} = @strs;

print Dumper \%data;

哪些输出:

$VAR1 = {
          'ISBN2' => 'name2',
          'ISBN6' => 'name6',
          'ISBN3' => 'name3',
          'ISBN5' => 'name5',
          'ISBN1' => 'name1',
          'ISBN4' => 'name4'
        };

或者所有压缩都没有临时变量(这可能是也可能不是改进):

my %data;
@data{ map { $_->text } $twig->get_xpath('//key') } =
           map { $_->text } $twig->get_xpath('//str');
print Dumper \%data;

虽然我建议您的源 XML 结构不正确 - 如果“key”和“str”匹配,它们应该在同一个元素中,因为这就是元素 for。如果您对此有任何控制权,我可以建议:

<?xml version="1.0" encoding="US-ASCII"?>
<books>
    <book key="ISBN1" name="name1" />
</books>

【讨论】:

  • 感谢 Sobrique。有效。你是对的,我试图解析的 Xml 格式不是很好。我得到了等效的 json 文件,可以按照我期望的格式进行解析。
【解决方案2】:

使用哈希切片将数据转换为所需的格式。

my %name_by_isbn;
@name_by_isbn{ @{ $data->{key} } } = @{ $data->{str} };

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2011-03-09
    • 2020-12-26
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多