使用XML :: Simple从哈希数组中构建XML,并将一些键作为属性
我正在使用
XML::Simple ,我希望将此数据转换为XML:
@rooms = ( { id => 4,is_key => 0,name => B507,capacity => 35 },{ id => 5,is_key => 1,name => B502,capacity => 24 } ); 我想输出这个: <rooms> <room id=4 is_key=0> <name>B507</name> <capacity>35</capacity> </room> <room id=5 is_key=1> <name>B502</name> <capacity>24</capacity> </room> </rooms> 我没有看到使用XML :: Simple :: XMLout做到这一点的方法.我错过了什么吗? 解决方法
我发现
XML::Simple 不直观且使用起来很尴尬.很容易最终只是抛出随机选项来试图让它工作.
但是如果你坚持下去就有办法.首先,ForceArray选项非常有用,正如文档所述,
因此,您需要调整数据,以便在解析原始XML时看起来ForceArray有效.这只涉及将所有数据放入一个匿名数组,这些数据应该是元素的内容而不是属性值. 此代码可满足您的需求. KeepRoot选项只是告诉XMLout顶级哈希是根元素,它不必将整个事物包装在另一个元素中. use strict; use warnings; use XML::Simple; my @rooms = ( { id => 4,name => 'B507',name => 'B502',capacity => 24 } ); for my $room (@rooms) { for my $k (keys %$room) { $room->{$k} = [ $room->{$k} ] unless grep $k eq $_,qw/ is_key id /; } } my $xml = {rooms => {room => @rooms} }; print XMLout($xml,KeepRoot => 1); 产量 <rooms> <room id="4" is_key="0"> <name>B507</name> <capacity>35</capacity> </room> <room id="5" is_key="1"> <name>B502</name> <capacity>24</capacity> </room> </rooms> 更新 您可能更喜欢使用 该程序接受对XML :: Simple解决方案的类似哈希引用,它们遍历所有/房间/房间元素,使用set_tag将所有名称和容量子节点设置为元素. 请注意,XML是使用标量$smart-> data()输出的,因为在列表上下文中调用时 如果您不了解属性和元素在XML中出现的顺序,则可以省略对$smart-> set_order的调用. use strict; use warnings; use XML::Smart; my @rooms = ( { id => 4,capacity => 24 } ); my $smart = XML::Smart->new; $smart->{rooms} = { room => @rooms }; for my $room (@{$smart->{rooms}{room}}) { $room->set_order(qw/ id is_key name capacity /); $room->{name}->set_tag; $room->{capacity}->set_tag; } print scalar $smart->data(noheader => 1,nometagen => 1); 产量 <rooms> <room id="4" is_key="0"> <name>B507</name> <capacity>35</capacity> </room> <room id="5" is_key="1"> <name>B502</name> <capacity>24</capacity> </room> </rooms> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |