繁体   English   中英

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

[英]XML::Simple in Perl not detecting all elements

我正在尝试使用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); 

根据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'
                              }
                            ]
                 }
        };

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'
                                              }
                            }
                 }
        };

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM