加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用XML :: Simple从哈希数组中构建XML,并将一些键作为属性

发布时间:2020-12-16 23:18:04 所属栏目:百科 来源:网络整理
导读:我正在使用 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 nameB507/name capacity35/capacity /room
我正在使用 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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读