7 use Data::Dump qw/dump/;
8 use Carp qw/confess cluck/;
12 CWMP::Parser - parse SOAP request XML
16 Design is based on my expirience with L<XML::Rules>, but show-stopper
17 was it's inability to parse invalid XML returned by some devices.
21 our $state; # FIXME check this!
28 foreach my $n ( keys %$tree ) {
29 next unless ref($tree->{$n}) eq 'ARRAY';
30 @out = map { $_->{value} } @{ $tree->{$n} };
34 die "no array in ",dump($tree) unless @out;
42 foreach my $n ( keys %$tree ) {
43 next unless ref($tree->{$n}) eq 'HASH';
44 $hash->{$n} = $tree->{$n}->{value};
46 die "no hash value in ",dump($hash) unless $hash;
53 foreach my $node ( keys %$tree ) {
54 next if $node =~ m/^_/;
58 if ( $node =~ m/GetRPCMethodsResponse/ ) {
60 $state->{MethodList} = [ _get_array( $tree->{$node}->{MethodList} ) ];
63 } elsif ( $node =~ m/(ID|MaxEnvelopes|CurrentTime|RetryCount)/ ) {
65 $state->{$1} = $tree->{$node}->{value};
69 } elsif ( $node =~ m/(DeviceId)/ ) {
71 $state->{$1} = _hash_value $tree->{$node};
74 } elsif ( $node =~ m/(Fault)/ && ! defined $tree->{$node}->{detail} ) {
76 $state->{$1} = _hash_value $tree->{$node};
79 } elsif ( $node =~ m/(EventStruct|ParameterValueStruct|ParameterInfoStruct)/ ) {
85 if ( ref $tree->{$node} eq 'HASH' ) {
86 push @{ $state->{$name} }, _hash_value $tree->{$node};
87 } elsif ( ref $tree->{$node} eq 'ARRAY' ) {
89 my $hash = _hash_value $tree->{$node}->[$_];
91 if ( my $n = delete $hash->{Name} ) {
92 my @keys = keys %$hash;
94 $state->{$name}->{$n} = $hash;
96 $state->{$name}->{$n} = $hash->{ $keys[0] };
97 warn "using $keys[0] as value for $name.$n\n";
100 push @{ $state->{$name} }, _hash_value $tree->{$node}->[$_]
101 foreach 0 .. $#{ $tree->{$node} };
106 } elsif ( $node =~ m/Inform/ ) {
108 $state->{_dispatch} = 'InformResponse';
110 } elsif ( ref($tree->{$node}) eq 'HASH' ) {
112 warn "## recurse $node\n";
113 _walk( $tree->{$node} );
118 # warn "XXX tree ",dump( $tree->{$node} );
119 warn "## state ",dump( $state );
127 my $xml = shift || confess "no xml?";
130 my $bare = XML::Bare->new( text => $xml );
131 my $hash = $bare->parse();
134 #warn "# parsed to ",dump($hash);