打印按属性排序的XML::简单哈希

打印按属性排序的XML::简单哈希,xml,perl,xml-simple,Xml,Perl,Xml Simple,我有一个如下所示的XML文件: <booklist> <book type="technical"> <author>Book 1 author 1</author> <author>Book 1 author 2</author> <title>Book 1 title</title> <isbn>Book1ISBN</isbn

我有一个如下所示的XML文件:

<booklist>
   <book type="technical">
      <author>Book 1 author 1</author>
      <author>Book 1 author 2</author>
      <title>Book 1 title</title>
      <isbn>Book1ISBN</isbn>
   </book>
   <book type="fiction">
      <author>Book 2 author 1</author>
      <author>Book 2 author 2</author>
      <title>Book 2 title</title>
      <isbn>Book2ISBN</isbn>
   </book>
   <book type="technical">
      <author>Book 3 author 1</author>
      <author>Book 3 author 2</author>
      <author>Book 3 author 3</author>
      <title>Book 3 title</title>
      <isbn>Book3ISBN</isbn>
   </book>
</booklist>
这将打印出:

print $booklist->{book}->{technical}->{title}  . "\n";
/tmp/walt $ ./bookparse_by_attrib.pl_dump
Book 3 title
因此,当我知道类型名称时,它就起作用了 但是,这会引发一个错误:

print $booklist->{book}->{type}->{title}  . "\n";
Use of uninitialized value in concatenation (.) or string at ./bookparse_by_attrib.pl_dump line 11.
这不会抛出错误-但是不会打印任何内容

#!/usr/bin/perl
use strict ;
use warnings ;
use XML::Simple ;
use Data::Dumper ;
my $book = ();
my $booklist = ();

foreach my $book (@{$booklist->{book}}) {
        print $book->{title} . "\n";
        }
我正试着打印出这些类型,只有我知道这些类型才行得通。 最后,我想把书的类型和书名打印出来,但现在,如果我能把类型打印出来,塔斯就太好了

键“book”的结构是散列引用,但是您将其视为数组引用(
@{$booklist->{book}}

您将遇到的一个普遍问题是,数据的结构是100%散列。一旦你有两本相同类型的书,你只会得到每种类型的最后一本书

#!/usr/bin/perl
use warnings;
use strict;

my $booklist = {
    'book' => {
        'technical' => {
            'author' => [
                'Book 3 author 1',
                'Book 3 author 2',
                'Book 3 author 3'
            ],
            'title' => 'Book 3 title',
            'isbn' => 'Book3ISBN'
        },
        'fiction' => {
            'author' => [
                'Book 2 author 1',
                'Book 2 author 2'
            ],
            'title' => 'Book 2 title',
            'isbn' => 'Book2ISBN'
        }
    }
};

for my $book_type ( keys %{ $booklist->{book} } ) {
    printf( "Title: %s\n", $booklist->{book}->{$book_type}->{title} );
}
键“book”的结构是一个散列引用,但是您将其视为一个数组引用(
@{$booklist->{book}}

您将遇到的一个普遍问题是,数据的结构是100%散列。一旦你有两本相同类型的书,你只会得到每种类型的最后一本书

#!/usr/bin/perl
use warnings;
use strict;

my $booklist = {
    'book' => {
        'technical' => {
            'author' => [
                'Book 3 author 1',
                'Book 3 author 2',
                'Book 3 author 3'
            ],
            'title' => 'Book 3 title',
            'isbn' => 'Book3ISBN'
        },
        'fiction' => {
            'author' => [
                'Book 2 author 1',
                'Book 2 author 2'
            ],
            'title' => 'Book 2 title',
            'isbn' => 'Book2ISBN'
        }
    }
};

for my $book_type ( keys %{ $booklist->{book} } ) {
    printf( "Title: %s\n", $booklist->{book}->{$book_type}->{title} );
}
键“book”的结构是一个散列引用,但是您将其视为一个数组引用(
@{$booklist->{book}}

您将遇到的一个普遍问题是,数据的结构是100%散列。一旦你有两本相同类型的书,你只会得到每种类型的最后一本书

#!/usr/bin/perl
use warnings;
use strict;

my $booklist = {
    'book' => {
        'technical' => {
            'author' => [
                'Book 3 author 1',
                'Book 3 author 2',
                'Book 3 author 3'
            ],
            'title' => 'Book 3 title',
            'isbn' => 'Book3ISBN'
        },
        'fiction' => {
            'author' => [
                'Book 2 author 1',
                'Book 2 author 2'
            ],
            'title' => 'Book 2 title',
            'isbn' => 'Book2ISBN'
        }
    }
};

for my $book_type ( keys %{ $booklist->{book} } ) {
    printf( "Title: %s\n", $booklist->{book}->{$book_type}->{title} );
}
键“book”的结构是一个散列引用,但是您将其视为一个数组引用(
@{$booklist->{book}}

您将遇到的一个普遍问题是,数据的结构是100%散列。一旦你有两本相同类型的书,你只会得到每种类型的最后一本书

#!/usr/bin/perl
use warnings;
use strict;

my $booklist = {
    'book' => {
        'technical' => {
            'author' => [
                'Book 3 author 1',
                'Book 3 author 2',
                'Book 3 author 3'
            ],
            'title' => 'Book 3 title',
            'isbn' => 'Book3ISBN'
        },
        'fiction' => {
            'author' => [
                'Book 2 author 1',
                'Book 2 author 2'
            ],
            'title' => 'Book 2 title',
            'isbn' => 'Book2ISBN'
        }
    }
};

for my $book_type ( keys %{ $booklist->{book} } ) {
    printf( "Title: %s\n", $booklist->{book}->{$book_type}->{title} );
}

我将重复我在你先前问题中的建议:

不要使用。这是一个过时的模块,当你试图破解它以提供你需要的格式时,它只会导致持续的问题

相反,使用直接提取听起来像您想要的信息:

use strict;
use warnings;

use List::MoreUtils qw(uniq);
use XML::LibXML;

my $xml = XML::LibXML->load_xml(IO => \*DATA);

my @types = sort +uniq map {$_->textContent()} $xml->findnodes('//book/@type');

for my $type (@types) {
    print "Type = $type\n";

    for my $book ($xml->findnodes("//book[\@type='$type']")) {
        print "  Title = " . $book->findvalue('title') . "\n";
    }
}

__DATA__
<booklist>
   <book type="technical">
      <author>Book 1 author 1</author>
      <title>Book 1 title</title>
      <isbn>Book1ISBN</isbn>
   </book>
   <book type="fiction">
      <author>Book 2 author 1</author>
      <author>Book 2 author 2</author>
      <title>Book 2 title</title>
      <isbn>Book2ISBN</isbn>
   </book>
   <book type="technical">
      <author>Book 3 author 1</author>
      <author>Book 3 author 2</author>
      <author>Book 3 author 3</author>
      <title>Book 3 title</title>
      <isbn>Book3ISBN</isbn>
   </book>
</booklist>

我将重复我在你先前问题中的建议:

不要使用。这是一个过时的模块,当你试图破解它以提供你需要的格式时,它只会导致持续的问题

相反,使用直接提取听起来像您想要的信息:

use strict;
use warnings;

use List::MoreUtils qw(uniq);
use XML::LibXML;

my $xml = XML::LibXML->load_xml(IO => \*DATA);

my @types = sort +uniq map {$_->textContent()} $xml->findnodes('//book/@type');

for my $type (@types) {
    print "Type = $type\n";

    for my $book ($xml->findnodes("//book[\@type='$type']")) {
        print "  Title = " . $book->findvalue('title') . "\n";
    }
}

__DATA__
<booklist>
   <book type="technical">
      <author>Book 1 author 1</author>
      <title>Book 1 title</title>
      <isbn>Book1ISBN</isbn>
   </book>
   <book type="fiction">
      <author>Book 2 author 1</author>
      <author>Book 2 author 2</author>
      <title>Book 2 title</title>
      <isbn>Book2ISBN</isbn>
   </book>
   <book type="technical">
      <author>Book 3 author 1</author>
      <author>Book 3 author 2</author>
      <author>Book 3 author 3</author>
      <title>Book 3 title</title>
      <isbn>Book3ISBN</isbn>
   </book>
</booklist>

我将重复我在你先前问题中的建议:

不要使用。这是一个过时的模块,当你试图破解它以提供你需要的格式时,它只会导致持续的问题

相反,使用直接提取听起来像您想要的信息:

use strict;
use warnings;

use List::MoreUtils qw(uniq);
use XML::LibXML;

my $xml = XML::LibXML->load_xml(IO => \*DATA);

my @types = sort +uniq map {$_->textContent()} $xml->findnodes('//book/@type');

for my $type (@types) {
    print "Type = $type\n";

    for my $book ($xml->findnodes("//book[\@type='$type']")) {
        print "  Title = " . $book->findvalue('title') . "\n";
    }
}

__DATA__
<booklist>
   <book type="technical">
      <author>Book 1 author 1</author>
      <title>Book 1 title</title>
      <isbn>Book1ISBN</isbn>
   </book>
   <book type="fiction">
      <author>Book 2 author 1</author>
      <author>Book 2 author 2</author>
      <title>Book 2 title</title>
      <isbn>Book2ISBN</isbn>
   </book>
   <book type="technical">
      <author>Book 3 author 1</author>
      <author>Book 3 author 2</author>
      <author>Book 3 author 3</author>
      <title>Book 3 title</title>
      <isbn>Book3ISBN</isbn>
   </book>
</booklist>

我将重复我在你先前问题中的建议:

不要使用。这是一个过时的模块,当你试图破解它以提供你需要的格式时,它只会导致持续的问题

相反,使用直接提取听起来像您想要的信息:

use strict;
use warnings;

use List::MoreUtils qw(uniq);
use XML::LibXML;

my $xml = XML::LibXML->load_xml(IO => \*DATA);

my @types = sort +uniq map {$_->textContent()} $xml->findnodes('//book/@type');

for my $type (@types) {
    print "Type = $type\n";

    for my $book ($xml->findnodes("//book[\@type='$type']")) {
        print "  Title = " . $book->findvalue('title') . "\n";
    }
}

__DATA__
<booklist>
   <book type="technical">
      <author>Book 1 author 1</author>
      <title>Book 1 title</title>
      <isbn>Book1ISBN</isbn>
   </book>
   <book type="fiction">
      <author>Book 2 author 1</author>
      <author>Book 2 author 2</author>
      <title>Book 2 title</title>
      <isbn>Book2ISBN</isbn>
   </book>
   <book type="technical">
      <author>Book 3 author 1</author>
      <author>Book 3 author 2</author>
      <author>Book 3 author 3</author>
      <title>Book 3 title</title>
      <isbn>Book3ISBN</isbn>
   </book>
</booklist>


这是一个很好的知识,XML::Simple不再工作了——但是这是他们在这家商店使用的模块,安装另一个模块需要提交给多个部门,由QA进行测试,为一个sysadm购买午餐,然后他们说服我的部门经理批准。我将致力于获取XML::LibXML,但现在我也不必使用XML::Simple-bug和allyou否决了我的问题-问题是针对XML::Simple的,而不是针对XML::LibXML的。我真的不在乎落选。我想将来我会在序言中指出,另一个perl模块无法解决这个特定的查询。我不会对一个问题投反对票,除非它没有显示出解决和/或解释问题的适当努力。其他人可能因为在2小时内发布了类似的问题而投了反对票,但我真的无法推断为什么有些人投了赞成票/反对票,因此大部分人都不担心。我想感谢你。我去系统管理员那里要求安装XML::libXML,他说:“是的,XML::Simple真的不起作用,我想用XML::libXML替换它已经有一段时间了。”这通常是一个漫长的过程,充满了文书工作、成本效益和大量批准,但他毫不犹豫地立即完成了。再次感谢你,我真为你高兴。这是我本周在这些论坛上可能听到的最好的消息。我希望你能享受工作效率的提高和头痛的减轻这是一个很好的知识,XML::Simple不再工作了——但是这是他们在这家商店使用的模块,安装另一个模块需要提交给多个部门,由QA进行测试,为一个sysadm购买午餐,然后他们说服我的部门经理批准。我将致力于获取XML::LibXML,但现在我也不必使用XML::Simple-bug和allyou否决了我的问题-问题是针对XML::Simple的,而不是针对XML::LibXML的。我真的不在乎落选。我想将来我会在序言中指出,另一个perl模块无法解决这个特定的查询。我不会对一个问题投反对票,除非它没有显示出解决和/或解释问题的适当努力。其他人可能因为在2小时内发布了类似的问题而投了反对票,但我真的无法推断为什么有些人投了赞成票/反对票,因此大部分人都不担心。我想感谢你。我去系统管理员那里要求安装XML::libXML,他说:“是的,XML::Simple真的不起作用,我想用XML::libXML替换它已经有一段时间了。”这通常是一个漫长的过程,充满了文书工作、成本效益和大量批准,但他毫不犹豫地立即完成了。再次感谢你,我真为你高兴。这是我本周在这些论坛上可能听到的最好的消息。我希望你喜欢你的节目