Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl中解析xml产生的输出格式与我预期的不同_Xml_Perl_Parsing - Fatal编程技术网

在perl中解析xml产生的输出格式与我预期的不同

在perl中解析xml产生的输出格式与我预期的不同,xml,perl,parsing,Xml,Perl,Parsing,我对perl非常陌生。我正在尝试使用PerlXML解析模块xml::Simple解析xml文件。 下面是我试图解析的示例xml: <?xml version="1.0" encoding="US-ASCII"?> <book> <key>ISBN1</key> <str>name1</str> <key>ISBN2</key> <str>name2</

我对perl非常陌生。我正在尝试使用PerlXML解析模块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>
输出为:

$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格式似乎与PerlXML解析器所期望的格式不同。有人能帮我找到一个更好的方法来获得预期的产出吗


提前感谢。

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

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

请不要使用。这是令人沮丧的

#!/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'
        };
或无温度变量的所有压缩(这可能是或可能不是一种改进):

虽然我建议您的源XML的结构很糟糕—如果“key”和“str”匹配,它们应该在同一个元素中,因为这就是元素的用途。如果你能控制它,我可以建议:

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

From
您确实不想在新代码中使用此模块。如果忽略此警告并使用它,qw(:strict)模式将为您省去一点麻烦。
XML::LibXML
XML::Twig
建议作为替代方法。谢谢Sobrique。成功了。你是对的,我试图解析的Xml格式不好。我得到了等价的json文件,可以用我期望的格式进行解析。
my %data;
@data{ map { $_->text } $twig->get_xpath('//key') } =
           map { $_->text } $twig->get_xpath('//str');
print Dumper \%data;
<?xml version="1.0" encoding="US-ASCII"?>
<books>
    <book key="ISBN1" name="name1" />
</books>