2013-01-07 17 views
5

XMLファイルを作成および解析するためにXML :: Smartを使用する単純なPerlスクリプトを作成しています。 XMLノードを削除する際に問題が発生しました。私は、次のコードを持っている:PerlとXML :: Smart - XMLファイルからノードを削除する方法

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

ことが期待されているものを行います - つまり、正しいノードが削除されます。しかし、私は後で(通常は働く)以下のコードを使用して、すべてのノード(特定のルートの子)をリストしようとすると:

my @objects = $XML->{object}('@') ; 
foreach my $object (@objects) { 
    say "$object->{address}"; 
}; 

Perlはその後、削除された1前のいずれかに、すべてのノードをリストアップし、 ;)(私は$ XML->データのさまざまな順列を使用してみました - 私は困惑

Not a HASH reference at g:/Dwimperl/perl/site/lib/XML/Smart/Tie.pm line 48, <STDIN> line 2. 

:次のエラーを吐き出しますしかし、何も働いていない。私はこの作業にXML :: Smartを使い続けることを望んでいるので、この問題がこの特定のライブラリで解決できることを願っています。

+2

良い最初の質問! – slm

+0

+1私はslmに同意します - これは上品に書かれています – Borodin

答えて

3

XML::Smartは、それが基づいているXML::Simple、よりずっといいですが、私の意見では、それはまだXMLデータを表す時、本当に非常に良いではありません。この場合、削除するノードはPerl配列の要素であることに注意してください。deleteを使用すると、その要素をそのまま置いたままで要素をundefに設定するだけです配列)。

このような配列を操作するには、要素を正しく削除し、後でスペースを埋めるために後で移動するspliceが必要です。 の代わりに

splice @{ $XML->{object} }, $n, 1 

の代わりにコードを使用してください。

2

existsdeleteを配列要素に使用しないでください。何も役に立たない。

要素を配列から削除するには、他のすべての要素をシフトダウンする必要があります。 spliceこれを行うことができます。

splice(@{ $XML->{object} }, $n, 1); 

それとも、それはあなたがよりよく理解するのに役立つならば、

splice(@{ $XML->{object} }, $n, 1,()); 
+0

素晴らしい - それは動作します!私は、Perl配列が正確に何であるかという悪い考えがあったと思いますが、これで完全にクリアされます。どうもありがとうございました! – marmarta

関連する問題