注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

Perl里面解析xml很方便  

2013-01-18 11:28:13|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最近写要写个脚本遍历xml,根据协议定义,自动生成idl接口 和 c++编解码代码。


这两个文章一定要看。

XML::Simple

http://search.cpan.org/~grantm/XML-Simple-2.20/lib/XML/Simple.pm#KeyAttr_=>_[_list_]_#_in+out_-_important


perl里面引用的用法

perlreftut

http://search.cpan.org/~dom/perl-5.12.5/pod/perlreftut.pod



use XML::Simple qw(:strict);
use Data::Dumper;
use strict;

# 下面一句就加载文档了。
# 关键的两个属性。KeyAttr 和 ForceArray 指定了要不要把某个节点解析为 哈希表。
# 查看一下 perl的 xml::simple 库的说明文档关于这个两个属性的说明。
my $xml = XMLin("diameter.xml",
KeyAttr => { typedefn =>'type-name'},
ForceArray => [ 'CCR', 'CCA', 'vendor', 'typedefn' , 'avp', 'enum', 'gavp' , 'field' ]);

# 打印 xml 树, 先把xml内容学部打印出来到一个文本里面看一下。 这样写代码
# 时就知道那个元素(节点)究竟是 哈希表还是数组了。
print Dumper($xml);
exit 0



# 一个遍历访问数组节点的 例子。
my $avps = $xml->{avp};
for my $avp (@{$avps}) {
#print getTypeName ($avp ), "\n";
#print getVarName ($avp ), "\n";
#print "$avp => ${$avps}{$avp}->{code} \n";
printAvpDefine($avp);
}

#如果设置把avp解析为 哈希表比如

my $cpp_xml = XMLin("lebara.xml",
KeyAttr => {avp => 'name', typedefn =>'type-name'},
ForceArray => [ 'CCR', 'CCA', 'vendor', 'typedefn' , 'avp', 'enum', 'gavp' , 'field' ]);

#一个遍历hash 节点的例子
my $avps = $xml->{avp};
for my $avp (keys %{$avps}) {
print "$avp => ${$avps}{$avp}->{code} \n";
}

#参考前面的perl一样的文档 $avp->{name} 了解 ->{} 是访问引用的写法就行了。 $avp->{'vendor-id'} 如果不是合法的变量名,需要加引号。
# 再来一句常见用法,大括号把变量名包含起来
print "typedef ${avpVarName} ${avpVarName}Avp;\n\n";


# $#{$avp->{enum}} 为 avp的enum数组的最后一个索引数字
if ($arrayIndex < $#{$avp->{enum}} ) {
print " ",uc getEnumName($enum->{name}), ",\n";
} else {
print " ",uc getEnumName($enum->{name}), "\n";


#引用的赋值,$command 是一个节点的引用, $commandName 就是一个name节点。
for my $command ( @{$xml->{command}} ) {
my $commandName = $command->{name};
print $commandName , "\n";
}


#简单的 格式化的对齐。
printf "%-30s %s" ," boolean", "pres;\n";


  评论这张
 
阅读(585)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017