如何在去重后按XML格式正确结束层级输出?
解决XML风格嵌套输出的关闭时机问题
我完全懂你想要的效果——就像XML标签那样,先打开父层级,把所有子内容处理完,再按相反顺序一层一层关闭。你现在的问题核心就是:代码在处理单个条目时就急着关闭上层标签了,没等同一层级下的所有内容都处理完。
问题出在哪?
你用的%seen和%again哈希逻辑不对:它们只判断内容是否第一次出现,导致处理完某个description下的第一个item后,立刻就关闭了description,连同一个description下的其他item都没处理;同理category也被过早关闭。另外,哈希的keys是无序的,这也会让输出顺序乱掉,完全不符合你要的嵌套层级逻辑。
修正后的代码思路
咱们换个方式,先把数据整理成多层级嵌套结构,这样就能清晰控制每个层级的开启和关闭时机,再按层级遍历输出:
my @Input = ( "Crockery breakable plates colors width", "Crockery breakable glasses colors volume", "Cutlery bendable forks steel chrome", "Cutlery bendable spoons plastic white", "Cutlery bendable spoons steel brown" ); # 第一步:把数据整理成多层级结构:分类 → 描述 → 物品 → 属性列表 my %data; foreach my $line (@Input) { my ($category, $desc, $item, @attrs) = split /\s+/, $line; push @{$data{$category}{$desc}{$item}}, join(" ", @attrs); } # 第二步:按层级遍历,严格遵循「开标签→处理子内容→关标签」的逻辑 foreach my $category (sort keys %data) { # 开启当前分类 print "1.Start catergory\n"; print "---$category\n"; foreach my $desc (sort keys %{$data{$category}}) { # 开启当前描述 print "2.----Start description\n"; print "------ $desc\n"; foreach my $item (sort keys %{$data{$category}{$desc}}) { # 处理当前物品 print "3.------Start of value\n"; print "-------- $item\n"; print join(" | ", @{$data{$category}{$desc}{$item}}) . "\n"; print "3.------End of value\n"; } # 所有物品处理完,才关闭当前描述 print "2.----End Description\n"; } # 所有描述处理完,才关闭当前分类 print "1.End Catergory\n"; }
代码为啥能解决问题?
- 多层级结构清晰:
%data把数据按「分类→描述→物品」的层级存起来,能明确看到每个分类下的所有内容,不会混乱; - 遍历顺序可控:用
sort keys保证输出顺序稳定(你可以根据需求调整排序规则); - 嵌套逻辑严谨:完全遵循「先开父标签,处理完所有子内容再关父标签」的规则,完美匹配你要的XML风格输出。
最终输出效果
运行这段代码后,就能得到你期望的结果:
1.Start catergory ---Crockery 2.----Start description ------ breakable 3.------Start of value -------- glasses colors volume 3.------End of value 3.------Start of value -------- plates colors width 3.------End of value 2.----End Description 1.End Catergory 1.Start catergory ---Cutlery 2.----Start description ------ bendable 3.------Start of value -------- forks steel chrome 3.------End of value 3.------Start of value -------- spoons plastic white | steel brown 3.------End of value 2.----End Description 1.End Catergory
内容的提问来源于stack exchange,提问作者user8956060
相关产品推荐
相关产品推荐

