5

XML::Smartを使用してXMLファイルを作成および解析する単純なPerlスクリプトを作成しています。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は、削除されたノードの前のノードまでのすべてのノードを一覧表示し、次のエラーを吐き出します。

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

私は困惑しています-$XML->data();のさまざまな順列を使用してみました。しかし、どれも機能しませんでした。このタスクには引き続きXML::Smartを使用したいので、この特定のライブラリ内でこの問題を解決できることを願っています。

4

2 に答える 2

3

それが基づいている、XML::Smartよりもはるかに優れXML::Simpleていますが、私の意見では、XMLデータを表現するのはまだあまり得意ではありません。この場合、削除するノードはPerl配列の要素であることに注意する必要があります。そのノードで使用すると、要素をそのままdeleteにして、要素をに設定するだけですundef(配列の最後の要素である場合を除く)。 )。

このように配列を操作するには、が必要ですsplice。これにより、要素が正しく削除され、後の要素が下に移動してスペースが埋められます。使用する

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

あなたとあなたのコードの代わりにあなたのdeleteために働くはずです。

于 2013-01-07T02:19:27.710 に答える
2

配列要素では絶対に使用existsしないでください。deleteどちらも有用なことは何もしません。

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

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

または、それが理解を深めるのに役立つ場合は、

splice(@{ $XML->{object} }, $n, 1, ());
于 2013-01-07T01:30:18.147 に答える