免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3316 | 回复: 3
打印 上一主题 下一主题

XML::Generator输出XML格式问题!!紧急求助!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-15 16:22 |只看该作者 |倒序浏览
  1. #! user/bin/perl -w
  2. use XML::Generator;
  3. my $xml_rule_list_final="<rule_list>
  4.   <interface_name> fastethernet0/0/3</interface_name>
  5.   <interface_dir>in</interface_dir>
  6.   <host>
  7.     <operator>deny</operator>
  8.     <protocol_type>ip</protocol_type>
  9.     <des_ip>192.168.45.0</des_ip>
  10.     <des_mask>0.0.0.255</des_mask>
  11.     <des_operator>eq</des_operator>
  12.     <des_port>80</des_port>
  13.     <sou_ip>192.168.1.0</sou_ip>
  14.     <sou_mask>0.0.0.255</sou_mask>
  15.     <sou_operator>eq</sou_operator>
  16.     <sou_port>80</sou_port>
  17.   </host>
  18.   <host>
  19.     <operator>permit</operator>
  20.     <protocol_type>tcp</protocol_type>
  21.     <des_ip>192.168.4.0</des_ip>
  22.     <des_mask>0.0.0.255</des_mask>
  23.     <des_operator>range</des_operator>
  24.     <des_port>56-78</des_port>
  25.     <sou_ip>192.168.12.0</sou_ip>
  26.     <sou_mask>0.0.0.255</sou_mask>
  27.     <sou_operator>lt</sou_operator>
  28.     <sou_port>23</sou_port>
  29.   </host>
  30.   <host>
  31.     <operator>deny</operator>
  32.     <protocol_type>ip</protocol_type>
  33.     <des_ip>0.0.0.0</des_ip>
  34.     <des_mask>255.255.255.255</des_mask>
  35.     <des_operator>eq</des_operator>
  36.     <des_port>80</des_port>
  37.     <sou_ip>10.10.10.0</sou_ip>
  38.     <sou_mask>0.0.0.255</sou_mask>
  39.     <sou_operator>eq</sou_operator>
  40.     <sou_port>80</sou_port>
  41.   </host>
  42. </rule_list>";

  43. my $gen=XML::Generator->new('escape'=>'always','pretty'=>2,'encoding'=>'utf-8');
  44. my $function=$gen->function( $gen->device("BJ-1"),
  45.                                              $xml_rule_list_final
  46.                                            );
  47.                        
  48. open CONFIGFILE,'>',"./out1.xml";
  49. print CONFIGFILE $function;
  50. close CONFIGFILE;
  51. print "./out1.xml";
复制代码
运行后,打开out1.xml后,格式就混在一起了————
  1. <function>
  2.   <device>BJ-1</device>
  3.   <rule_list><interface_name> fastethernet0/0/3</interface_name><interface_dir>in</interface_dir><host>
  4.   <operator>deny</operator><protocol_type>ip</protocol_type><des_ip>192.168.45.0</des_ip><des_mask>0.0.0.255</des_mask>
  5.   <des_operator>eq</des_operator><des_port>80</des_port><sou_ip>192.168.1.0</sou_ip><sou_mask>0.0.0.255</sou_mask>
  6.   <sou_operator>eq</sou_operator><sou_port>80</sou_port></host><host><operator>permit</operator>
  7.   <protocol_type>tcp</protocol_type><des_ip>192.168.4.0</des_ip><des_mask>0.0.0.255</des_mask>
  8.   <des_operator>range</des_operator><des_port>5678</des_port><sou_ip>192.168.12.0</sou_ip>
  9.   <sou_mask>0.0.0.255</sou_mask><sou_operator>lt</sou_operator><sou_port>23</sou_port>
  10.   </host><host></rule_list>
  11. </function>
复制代码
可是,当我把XML文档的内容粘到TXT下后——,又有层次了————
这是什么原因啊???该怎么解决啊!!!!
跪求大神

论坛徽章:
0
2 [报告]
发表于 2013-12-15 16:27 |只看该作者
追加说明:
该代码如果不输出到XML文件,直接print在终端上后,< 和>号会不识别,如图:
  1. <function>
  2.   <device>BJ-1</device>&lt;rule_list&gt;
  3.   &lt;interface_name&gt; fastethernet0/0/3&lt;/interface_name&gt;
  4.   &lt;interface_dir&gt;in&lt;/interface_dir&gt;
  5.   &lt;host&gt;
  6.     &lt;operator&gt;deny&lt;/operator&gt;
  7.     &lt;protocol_type&gt;ip&lt;/protocol_type&gt;
  8.     &lt;des_ip&gt;192.168.45.0&lt;/des_ip&gt;
  9.     &lt;des_mask&gt;0.0.0.255&lt;/des_mask&gt;
  10.     &lt;des_operator&gt;eq&lt;/des_operator&gt;
  11.     &lt;des_port&gt;80&lt;/des_port&gt;
  12.     &lt;sou_ip&gt;192.168.1.0&lt;/sou_ip&gt;
  13.     &lt;sou_mask&gt;0.0.0.255&lt;/sou_mask&gt;
  14.     &lt;sou_operator&gt;eq&lt;/sou_operator&gt;
  15.     &lt;sou_port&gt;80&lt;/sou_port&gt;
  16.   &lt;/host&gt;
  17.   &lt;host&gt;
  18.     &lt;operator&gt;permit&lt;/operator&gt;
  19.     &lt;protocol_type&gt;tcp&lt;/protocol_type&gt;
  20.     &lt;des_ip&gt;192.168.4.0&lt;/des_ip&gt;
  21.     &lt;des_mask&gt;0.0.0.255&lt;/des_mask&gt;
  22.     &lt;des_operator&gt;range&lt;/des_operator&gt;
  23.     &lt;des_port&gt;56-78&lt;/des_port&gt;
  24.     &lt;sou_ip&gt;192.168.12.0&lt;/sou_ip&gt;
  25.     &lt;sou_mask&gt;0.0.0.255&lt;/sou_mask&gt;
  26.     &lt;sou_operator&gt;lt&lt;/sou_operator&gt;
  27.     &lt;sou_port&gt;23&lt;/sou_port&gt;
  28.   &lt;/host&gt;
  29.   &lt;host&gt;
  30.     &lt;operator&gt;deny&lt;/operator&gt;
  31.     &lt;protocol_type&gt;ip&lt;/protocol_type&gt;
  32.     &lt;des_ip&gt;0.0.0.0&lt;/des_ip&gt;
  33.     &lt;des_mask&gt;255.255.255.255&lt;/des_mask&gt;
  34.     &lt;des_operator&gt;eq&lt;/des_operator&gt;
  35.     &lt;des_port&gt;80&lt;/des_port&gt;
  36.     &lt;sou_ip&gt;10.10.10.0&lt;/sou_ip&gt;
  37.     &lt;sou_mask&gt;0.0.0.255&lt;/sou_mask&gt;
  38.     &lt;sou_operator&gt;eq&lt;/sou_operator&gt;
  39.     &lt;sou_port&gt;80&lt;/sou_port&gt;
  40.   &lt;/host&gt;
  41. &lt;/rule_list&gt;
  42. </function>
复制代码
为什么啊

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
3 [报告]
发表于 2013-12-16 00:05 |只看该作者
本帖最后由 rubyish 于 2013-12-15 20:32 编辑

错误的用法~ )
xml 与 hash 类似,一个一个 key, value.
biru:
  1. $gen->device("BJ-1"),
复制代码
key : device
value: "BJ-1"
line 45~47
  1. my $function=$gen->function( $gen->device("BJ-1"),
  2.                                              $xml_rule_list_final
  3.                                            );
复制代码
你这样做是类似下面的代码:
  1. my %hash;
  2. my $value = '{ a => 1, b => 2 }';
  3. $hash{key} = $value;
复制代码
now 你想要
  1. print $hash{key}{a};
复制代码
你想输出为什么不是 1 呢?

'{ a => 1, b => 2 }' 看起来类似 hash ref, 但它不

该怎么解决?
1: 手动编辑(copy, paste) + 格式化
可以copy过去一个XML字符串
paste,并将它格式化.
XML格式化工具,在
http://www.freeformatter.com/xml-formatter.html

2: dosomething
biru:
  1. use XML::Generator;
  2. my $xml_rule_list_final = "<rule_list>
  3.   <interface_name> fastethernet0/0/3</interface_name>
  4.   <interface_dir>in</interface_dir>
  5.   <host>
  6.     <operator>deny</operator>
  7.     <protocol_type>ip</protocol_type>
  8.     <des_ip>192.168.45.0</des_ip>
  9.     <des_mask>0.0.0.255</des_mask>
  10.     <des_operator>eq</des_operator>
  11.     <des_port>80</des_port>
  12.     <sou_ip>192.168.1.0</sou_ip>
  13.     <sou_mask>0.0.0.255</sou_mask>
  14.     <sou_operator>eq</sou_operator>
  15.     <sou_port>80</sou_port>
  16.   </host>
  17.   <host>
  18.     <operator>permit</operator>
  19.     <protocol_type>tcp</protocol_type>
  20.     <des_ip>192.168.4.0</des_ip>
  21.     <des_mask>0.0.0.255</des_mask>
  22.     <des_operator>range</des_operator>
  23.     <des_port>56-78</des_port>
  24.     <sou_ip>192.168.12.0</sou_ip>
  25.     <sou_mask>0.0.0.255</sou_mask>
  26.     <sou_operator>lt</sou_operator>
  27.     <sou_port>23</sou_port>
  28.   </host>
  29.   <host>
  30.     <operator>deny</operator>
  31.     <protocol_type>ip</protocol_type>
  32.     <des_ip>0.0.0.0</des_ip>
  33.     <des_mask>255.255.255.255</des_mask>
  34.     <des_operator>eq</des_operator>
  35.     <des_port>80</des_port>
  36.     <sou_ip>10.10.10.0</sou_ip>
  37.     <sou_mask>0.0.0.255</sou_mask>
  38.     <sou_operator>eq</sou_operator>
  39.     <sou_port>80</sou_port>
  40.   </host>
  41. </rule_list>";

  42. my ( $interface, @host ) = split /<host>/, $xml_rule_list_final;
  43. my ( $interface_name, $interface_dir ) =
  44.   $interface =~ /me>\s*(.*?)<.*>(.*)</s;
  45. @host = map { { /<(\w+)>(.*?)</sg } } @host;

  46. my @host_key = qw/operator
  47.   protocol_type
  48.   des_ip
  49.   des_mask
  50.   des_operator
  51.   des_port
  52.   sou_ip
  53.   sou_mask
  54.   sou_operator
  55.   sou_port/;

  56. my $gen = new XML::Generator(
  57.     'conformance' => 'strict',
  58.     'escape'      => 'always',
  59.     'pretty'      => 2,
  60.     'encoding'    => 'utf-8'
  61. );

  62. my $xml = $gen->function(
  63.     $gen->device("BJ-1"),
  64.     $gen->rule_list(
  65.         $gen->interface_name($interface_name),
  66.         $gen->interface_dir($interface_dir),
  67.         map {
  68.             my %h = %$_;
  69.             $gen->host( map { $gen->$_( $h{$_} ) } @host_key )
  70.         } @host
  71.     )
  72. );

  73. print $gen->xmldecl;
  74. print $xml;
复制代码

论坛徽章:
0
4 [报告]
发表于 2013-12-16 08:49 |只看该作者
问题解决了!!!!!!!!!!感谢上楼!!不会@————嘿嘿
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP