我正在使用
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选项非常有用,正如文档所述,
Check out “ForceArray” because you’ll almost certainly want to turn it on
因此,您需要调整数据,以便在解析原始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::Smart
的解决方案,它允许您指定哪些节点是元素,哪些节点是标签.这允许您保持@rooms中的原始数据不变.
该程序接受对XML :: Simple解决方案的类似哈希引用,它们遍历所有/房间/房间元素,使用set_tag将所有名称和容量子节点设置为元素.
请注意,XML是使用标量$smart-> data()输出的,因为在列表上下文中调用时
data方法将返回第二个值:一个布尔标志,指示XML是否是Unicode编码的.这似乎没有记录在POD中.
如果您不了解属性和元素在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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。