2010-08-04 7 views
0

Я использую XML :: Simple для синтаксического анализа XML-файла. Выход - хэш. (С использованием Data :: Dumper)Perl XML Parsing

Пример кода, XML-файл приведен ниже с выходом. Код

Perl:

use XML::Simple; 
use Data::Dumper; 

$xml = new XML::Simple; 

$data = $xml->XMLin("spam.xml"); 

print Dumper($data); 

содержимое XML-файлов (вход синтаксического анализатора) ::

<Attach_request> 
    <Protocol_discriminator> 
     <name> Protocol_discriminator </name> 
     <attribute> Mandatory </attribute> 
     <type> nibble </type> 
     <value> 7 </value> 
     <min> 0 </min> 
     <max> F </max> 
    </Protocol_discriminator> 
    <Security_header> 
     <name> Security_header </name> 
     <attribute> Mandatory </attribute> 
     <type> nibble </type> 
     <value> 7 </value> 
     <min> 0 </min> 
     <max> F </max> 
    </Security_header> 
    <Security_header1> 
     <name> Security_header </name> 
     <attribute> Mandatory </attribute> 
     <type> nibble </type> 
     <value> 7 </value> 
     <min> 0 </min> 
     <max> F </max> 
    </Security_header1> 
    <Security_header2> 
     <name> Security_header </name> 
     <attribute> Mandatory </attribute> 
     <type> nibble </type> 
     <value> 7 </value> 
     <min> 0 </min> 
     <max> F </max> 
    </Security_header2> 
    <Security_header3> 
     <name> Security_header </name> 
     <attribute> Mandatory </attribute> 
     <type> nibble </type> 
     <value> 7 </value> 
     <min> 0 </min> 
     <max> F </max> 
    </Security_header3> 
</Attach_request> 

Выход ::

$VAR1 = { 
      'Security_header3' => { 
           'attribute' => ' Mandatory ', 
           'min' => ' 0 ', 
           'value' => ' 7 ', 
           'max' => ' F ', 
           'name' => ' Security_header ', 
           'type' => ' nibble ' 
           }, 
      'Protocol_discriminator' => { 
             'attribute' => ' Mandatory ', 
             'min' => ' 0 ', 
             'value' => ' 7 ', 
             'max' => ' F ', 
             'name' => ' Protocol_discriminator ', 
             'type' => ' nibble ' 
            }, 
      'Security_header2' => { 
           'attribute' => ' Mandatory ', 
           'min' => ' 0 ', 
           'value' => ' 7 ', 
           'max' => ' F ', 
           'name' => ' Security_header ', 
           'type' => ' nibble ' 
           }, 
      'Security_header' => { 
           'attribute' => ' Mandatory ', 
           'min' => ' 0 ', 
           'value' => ' 7 ', 
           'max' => ' F ', 
           'name' => ' Security_header ', 
           'type' => ' nibble ' 
          }, 
      'Security_header1' => { 
           'attribute' => ' Mandatory ', 
           'min' => ' 0 ', 
           'value' => ' 7 ', 
           'max' => ' F ', 
           'name' => ' Security_header ', 
           'type' => ' nibble ' 
           } 
     }; 

Мой другой вопрос:

  1. Есть ли способ, которым я могу manintain порядок вывода, то же, что я дал во входном файле XML?

ответ

6

Если вы смотрите документацию XML::Simple, он утверждает, что

XML :: Simple способен представить простой API, потому что это делает некоторые предположения от Вашего имени. К ним относятся:

  1. Вы не заинтересованы в текстовом контенте, состоящие только из пробельных

  2. Вы не возражаете, что, когда вещи получают отхлебнуло в хэш порядок теряется

  3. Вам не нужен мелкозернистый контроль форматирования сгенерированного XML

  4. Вы никогда не использовали бы хэш-ключ, который не был юридическим именем XML-элемента

  5. Вам не нужна помощь в преобразовании различных кодировок.

для дерева на основе синтаксического анализа, вы можете выбрать между подходом «Perlish» из XML :: Twig и более стандартов, основанных реализации DOM - предпочтительно один с поддержкой XPath.

см. Также «Perl-XML FAQ» для более подробной информации.

0

Я сомневаюсь, что это возможно с помощью XML :: Simple (возможно, вам придется сортировать хэш-ключи каким-то образом). Вы также можете использовать XML :: DOM и перечислять через дочерние узлы.

0

Некоторые заказа будут сохранены, если вы отключили опцию KeyAttr.Если вы решили придерживаться XML :: Simple и возиться с различными настройками, то вы действительно должны иметь быстрый читать эту статью:

Лучше было бы угробить XML :: Simple в целом в соответствии с рекомендациями в этой статье: