Perl XML Парсинг - PullRequest
       1

Perl XML Парсинг

0 голосов
/ 04 августа 2010

Я использую XML :: Simple для анализа XML-файла.Выходные данные представляют собой хеш (с использованием Data :: Dumper)

Пример кода, 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. Есть ли способ, которым я могу управлятьпорядок вывода, то же самое я дал во входном XML-файле ??

Ответы [ 4 ]

6 голосов
/ 04 августа 2010

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

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

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

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

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

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

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

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

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

0 голосов
/ 18 марта 2011

Просто используйте XML :: LibXML .

0 голосов
/ 05 августа 2010

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

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

0 голосов
/ 04 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...