1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<datas>
<data id="1">
<page>1</page>
</data>
<data id="2">
<page>2</page>
<data id="2.1">
<page>2</page>
<data id="2.1.1">
<page>2</page>
</data>
</data>
</data>
</datas>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
use strict; use XML::Simple; use Data::Dumper; my $xml = new XML::Simple; my $data = $xml->XMLin("data.xml", KeyAttr => [], ForceArray => 1); my @todos = (); push @todos, { data => $_ } for @{$data->{data}}; while (@todos) { my $todo = pop @todos; if ($todo->{data}{id} =~ /^2$/){ print "delete\n"; delete ($todo->{data}); # splice(@{$todo->{data}},0); print Dumper $todo; next; } } XMLout($data, OutputFile => 'out.xml', rootname => 'items', XMLDecl => '<?xml version="1.0" encoding="UTF-8"?>'); print Dumper $data;
2013-03-08T10:34:51 guenniHallo,
in einem anderen Thread habe ich gelernt (??) wie ich durch verschachtelte Nodes parsen kann.
Inzwischen kann ich diese auch bearbeiten und sortieren.
Jetzt möchte ich gerne noch einzelne dieser Nodes löschen.
Code (perl): (dl )1 2 3 4 5 6 7 8 9my $data = $xml->XMLin("data.xml", KeyAttr => [], ForceArray => 1); my @todos = (); push @todos, { data => $_ } for @{$data->{data}}; while (@todos) { ... delete ($todo->{data}); ... } print Dumper $data;
Im Dump innerhalb der Schleife kann ich sehen, das der Node mit der "id=2" nach dem delete leer ist ($VAR1 = {};).
Im Dump nach der Ausgabe und in der Ausgabe selbst ist aber alles noch enthalten.
Irgendwie habe ich das ganze Konzept wohl noch nicht verstanden, kann mir vielleicht jemand erläutern wo mein Denkfehler ist.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
my @todos = $data; while (@todos) { my $todo = pop @todos; if (exists $todo->{data}) { for (my $x=0; $x < @{$todo->{data}}; $x++) { if ($todo->{data}[$x]{id} eq '2') { delete $todo->{data}[$x]; } else { push @todos, $todo->{data}[$x]; } } } }
$todo->{data}{id} = 5 if ($todo->{data}{id} =~ /^1$/);
push @todos, { data => $_ } for @{$data->{data}};
push @todos, { fuzzl => $_ } for @{$data->{data}};