2010-08-04 6 views
0

J'utilise XML :: Simple pour analyser un fichier XML. La sortie est un hachage (en utilisant Data :: Dumper)Perl XML Parsing

Exemple de code, le fichier XML est donné ci-dessous avec sortie.

code Perl:

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

$xml = new XML::Simple; 

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

print Dumper($data); 

contenu du fichier XML (entrée à l'analyseur) ::

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

Sortie ::

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

Mon autre question est la suivante:

  1. Y at-il un moyen que je peux manintain l'ordre de la sortie, le même que j'ai donné dans le fichier XML d'entrée ??

Répondre

6

Si vous voyez la documentation de XML::Simple, il affirme que

XML :: Simple est en mesure de présenter une API simple car il fait quelques hypothèses en votre nom. Ceux-ci comprennent:

  1. Vous n'êtes pas intéressé par le contenu du texte ne comportant que des espaces

  2. Cela ne vous dérange pas que quand les choses se slurped dans un hachage de l'ordre est perdu

  3. Vous ne voulez pas un contrôle précis de la mise en forme du code XML généré

  4. Vous n'utiliserez jamais une clé de hachage qui n'était pas un nom d'élément XML légal

  5. Vous n'avez pas besoin d'aide pour la conversion entre différents codages.

Pour l'analyse syntaxique arborescente, vous pouvez choisir entre l'approche 'perlienne' de XML :: Twig standards et plus basés implémentations DOM - de préférence avec support XPath. Pour plus de détails, voir également 'Perl-XML FAQ' pour plus de détails.

0

Je doute que ce soit possible avec XML :: Simple (peut-être que vous auriez à trier les clés de hachage d'une manière ou d'une autre). Vous pouvez également utiliser XML :: DOM et énumérer les nœuds enfants.