Perl和XML :: Smart - 如何从XML文件中删除节点

mar*_*rta 5 xml perl

我正在编写一个简单的Perl脚本,它使用XML :: Smart来创建和解析XML文件.我遇到了删除XML节点的问题.我有以下代码:

if ( exists $XML->{object}[$n] ) {
    delete $XML->{object}[$n] ;
};
$XML->save('dane.xml') ;
Run Code Online (Sandbox Code Playgroud)

它做了预期的事情 - 即删除了正确的节点.但是,当我稍后尝试列出所有节点(特定根的子节点)时,使用下面的代码(通常可以工作):

my @objects = $XML->{object}('@') ;
foreach my $object (@objects) {
    say "$object->{address}";
}; 
Run Code Online (Sandbox Code Playgroud)

Perl列出所有节点,直到删除之前的节点,然后吐出以下错误:

Not a HASH reference at g:/Dwimperl/perl/site/lib/XML/Smart/Tie.pm line 48, <STDIN> line 2.
Run Code Online (Sandbox Code Playgroud)

我很难过 - 我尝试使用$ XML-> data()的各种排列方式; 但都没有用.我更愿意继续使用XML :: Smart来完成这项任务,所以我希望这个问题可以在这个特定的库中解决.

Bor*_*din 3

虽然XML::Smart它比它所基于的 好得多XML::Simple,但在我看来,它仍然不太擅长表示 XML 数据。在这种情况下,您必须知道要删除的节点是 Perl 数组的一个元素,使用delete它只会将该元素设置为undef,同时将其保留在原处(除非它恰好是数组的最后一个元素)。

要像这样操作数组,您需要splice,它可以正确删除元素并将后面的元素向下移动以填充空间。使用

splice @{ $XML->{object} }, $n, 1
Run Code Online (Sandbox Code Playgroud)

而不是你的delete,你的代码应该适合你。