XML :: Simple в Perl не обнаруживает все элементы - PullRequest
3 голосов
/ 08 декабря 2011

Я пытаюсь проанализировать XML в Perl, используя XML :: Simple.

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

Для каждого элемента документа отображается только последний элемент содержимого.Есть ли причина для этого?Что я могу сделать, чтобы он обнаружил все элементы контента?

Редактировать: Вот код:

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 ]

8 голосов
/ 08 декабря 2011

За 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 голос
/ 08 декабря 2011

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'
                                              }
                            }
                 }
        };
0 голосов
/ 08 декабря 2011

XML :: Simple обрабатывает имя как уникальный идентификатор для повторяющихся элементов XML.Попробуйте переключиться для тестирования 'саке свои атрибуты' name 'на' label '.Я ожидаю, что вы увидите выход самосвала, который вы ожидаете.Давайте посмотрим на XML :: Fast, который, как я обнаружил, гораздо более последовательный, не говоря уже о том, что он будет на порядок быстрее.

...