2011-09-28 77 views
2

如何在使用XML的Perl代码中排序输入标签::简单模块以指定顺序以XML格式打印输出.. 我有试过这种使用Perl在XML中排序输入标签::使用Perl打印XML格式的输出时使用Perl

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; 

,但我没有得到我required..i需要订单的订货 - >名称,SSID配置,Connectionmode,connectiontype,自动开关,MSM。帮助我

+2

你不能,这不是XML :: Simple的工作原理。它不保留元素的顺序。 – mirod

回答

2

,你想为你的XML两件事情在我看来:

  • 没有属性,因此NoAttr选项中的XML ::简单对象创建
  • 元素的顺序应按照规定

我不确定为什么你不想在你的XML中使用属性,为什么你用它来创建它的数据结构有它们。你可能想看看。在任何情况下,XML :: Simple都可以为您提供此功能。

对于第二部分,XML :: Simple不保留顺序,我找不到它的方法,所以你需要别的东西。

对于一个快速和肮脏的解决方案,XML的一点点::嫩枝在那里会做:

# 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个ARGS开放和词汇句柄是个好习惯(从3 ARG开放警察局此消息; - )
+0

谢谢你mirod你帮我一个洛特..感谢您的意见也..我想订购的sharedkey的元素也(keyType保护keyMaterial)我该怎么做?和我可以缩进使用XML :: Twig的输出? – alily

+0

@ user968434确定,将'pretty_print =>'indented''传递给'new'或'print':'$ data-> print(pretty_print =>'indented',\ * FH);'代码,它应该是'autoSwitch'(uper case S),而不是'autoswitch',因为我已经写了,这会搞砸输出 – mirod

+0

谢谢,输出现在缩进了.. :)但是sharedKey的属性顺序仍然是不是固定的,我需要它作为keyType,protected,keyMaterial,而Iam获得它们的顺序是keyMaterial,keyType,protected.How我应该修复它? – alily

2

哈希是不订购。你可以尝试使用Tie::IxHash(它看起来像一个散列,但维护插入顺序)而不是一个正常的散列。如果这不起作用,XML :: Simple将不会对您有用。

+0

它不起作用。很久以前,我试着让这两个模块互相发挥很好的作用,但它并没有起作用,XML :: Simple在很多地方复制了哈希,因为它很简单。 – mirod