XML ::在Perl中简单,不检测所有元素

时间:2011-12-07 20:04:36

标签: xml perl xml-parsing

我正在尝试使用XML :: Simple解析Perl中的一些XML。

XML遵循以下格式:

   <result>
    <doc>
      <field name="title">Sample Title</field>
      <field name="content">Content 1</field>
      <field name="content">Content 2</field>
      .
      .
      .
      <field name="content">Content n</field>
    </doc>
   </result>

使用XML :: Simple我试图解析它并打印标题和所有内容。问题是只打印了最后一个内容项。我决定使用Dumper,这就是它的回报:

$VAR1= {
  'result'=> {  
           'doc' => [
                {
                  'field' => {                    
                                'content' => {
                                             'content' => 'Content n'
                                             },
                                'title' => {
                                             'content' => 'Sample Title'
                                           }
                                 }
                      }

仅为每个doc元素显示最后一个内容项。这有什么理由吗?如何让它检测所有内容项?

编辑:这是代码:

my $url = "http://www.testurl.com/test.xml";
my $content = get $url;
die "Couldn't get XML" unless defined $content;

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

3 个答案:

答案 0 :(得分:8)

根据POD:

  

注1:'KeyAttr'的默认值是['name','key','id']。如果您不想在输入上折叠或在输出上展开,则必须将此选项设置为空列表以禁用该功能。

它将“名称”作为ID类型字段并将元素折叠在一起。

 perl -MXML::Simple -MData::Dumper

my $raw = <<XML_SAMPLE;
 <result>
    <doc>
      <field name="title">Sample Title</field>
      <field name="content">Content 1</field>
      <field name="content">Content 2</field>
      .
      .
      .
      <field name="content">Content n</field>
    </doc>
   </result>
XML_SAMPLE

my $xml = new XML::Simple;
my $xmlData = $xml->XMLin($raw, KeyAttr => []);
print Dumper($xmlData);

__END__
$VAR1 = {
          'doc' => {
                   'content' => '
      .
      .
      .
      ',
                   'field' => [
                              {
                                'content' => 'Sample Title',
                                'name' => 'title'
                              },
                              {
                                'content' => 'Content 1',
                                'name' => 'content'
                              },
                              {
                                'content' => 'Content 2',
                                'name' => 'content'
                              },
                              {
                                'content' => 'Content n',
                                'name' => 'content'
                              }
                            ]
                 }
        };

答案 1 :(得分:1)

KeyAttr

use warnings;
use strict;
use XML::Simple;
use Data::Dumper;

$Data::Dumper::Sortkeys=1;

my $str = '
<result>
    <doc>
      <field name="title">Sample Title</field>
      <field name="content">Content 1</field>
      <field name="content">Content 2</field>
      <field name="content">Content n</field>
    </doc>
</result>
';

print Dumper(XMLin($str, KeyAttr => 'content'));

__END__

$VAR1 = {
          'doc' => {
                   'field' => {
                              'Content 1' => {
                                             'name' => 'content'
                                           },
                              'Content 2' => {
                                             'name' => 'content'
                                           },
                              'Content n' => {
                                             'name' => 'content'
                                           },
                              'Sample Title' => {
                                                'name' => 'title'
                                              }
                            }
                 }
        };

答案 2 :(得分:0)

XML :: Simple将name视为重复xml元素的唯一标识符。尝试将测试的“名称”属性切换为“标签”。我希望你会看到你期望的翻斗车输出。给我看一下XML :: Fast,我发现它更加一致,更不用说至少快一个数量级了。