Упорядочение тегов ввода в XML :: Simple с использованием Perl при печати вывода в формате XML - PullRequest
2 голосов
/ 28 сентября 2011

Как упорядочить входные теги в коде Perl с помощью модуля XML :: Simple для печати вывода в формате XML в указанном порядке. Я пробовал это

    use XML::Simple;
    use Data::Dumper;
    open (FH,"> xml4.txt") || die (); 
    # create array
    @arr = {
        'name'=>['Cisco102'],
        'SSIDConfig'=>[
                {'SSID'=> [{'name'=>'Cisco102'}]}],
        'connectionType'=>['ESS'],
        'connectionMode'=>['auto'],
        'autoSwitch'=>['false'],
        'MSM'=>[{'security' =>[ { 'authEncryption' =>[{'authentication' => 'open',
                        'encryption' => 'WEP',
                          'useOneX' => 'false'
                                        }],
                      'sharedKey' =>[ {
                                     'keyType' => 'networkKey',
                                     'protected' => 'false',
                                     'keyMaterial' => '1234567890'
                                   }]}]}]};
# create object
$xml = new XML::Simple(NoAttr=>1,RootName=>'WLAN Profile');
# convert Perl array ref into XML document
 $data = $xml->XMLout(@arr,xmldecl => '<?xml version="1.0" encoding="US-ASCII"?>');
# access XML data
print FH $data;

, но не получаю заказчто мне нужно .. мне нужен порядок -> имя, SSID Config, режим соединения, тип соединения, автопереключение, MSM. помогите мне

Ответы [ 2 ]

2 голосов
/ 28 сентября 2011

Мне кажется, что вы хотите 2 вещи для вашего XML:

  • без атрибутов, следовательно, опция NoAttr в XML :: Простое создание объекта
  • порядок элементов должен быть таким, как указано

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

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

Для быстрого и грязного решения, немного XML :: Twig там будет делать:

# instead of the print FH $data; line

my $twig= XML::Twig->new( )->parse( $data);
$twig->root->set_content( map { $dtwig->root->first_child( $_) } (qw( name SSIDConfig connectionMode connectionType autoSwitch MSM)) );

$twig->print( \*FH);

Еще пара комментариев:

  • Вы не можете использовать «Профиль WLAN» в качестве корневого тега, имена XML не могут содержать пробелы
  • Когда вы задаете вопрос о Perl, обычно считается вежливым показывать код, который использует строгие правила и предупреждения
  • правильный способ открыть выходной файл будет my $out_file= xml4.txt; open ( my $fh,'>', $out_file) or die "cannot create $out_file: $!"; (или использовать autodie вместо die), использование 3-х открытых аргументов и лексических файловых дескрипторов - хорошая привычка (это сообщение из 3-аргументного открытого отдел полиции; -)
2 голосов
/ 28 сентября 2011

Хеши не заказаны. Вы можете попробовать использовать Tie :: IxHash (который выглядит как хеш, но поддерживает порядок вставки) вместо обычного хеша. Если это не сработает, XML :: Simple не будет вам полезен.

...